• Как подружить go и Sphinx?

    @dimuska139 Автор вопроса
    Backend developer
    Может пригодится кому-то. Сейчас Sphinx юзать нет смысла, т.к. есть Manticore - они совместимы. И для работы с Manticore для Go есть официальный sdk-клиент.
    Ответ написан
    Комментировать
  • Какое окружение вы используете для разработки php?

    @dimuska139
    Backend developer
    Использую следующее:
    1. PhpStorm (IDE). Чтобы он работал быстро, проекты следует держать на SSD.
    2. DBeaver для просмотра содержимого и структуры БД (сами изменения в БД делаю через миграции)
    3. Postman для того, чтобы дёргать эндпоинты, смотреть ответы и заголовки
    4. Docker в связке с docker-compose

    В качестве СУБД обычно использую PostgreSQL, для кеша - Redis. Но это вообще много от чего зависит уже.
    Ответ написан
    2 комментария
  • Как защитить сервер от большого потока аякс запросов от пользователя?

    @dimuska139
    Backend developer
    Нужно на уровне Nginx сделать ограничение количества запросов в секунду с IP. Вот тут подробнее.
    Ответ написан
  • Стоит ли использовать Django Forms, WTForms и т.д.?

    @dimuska139
    Backend developer
    Вот по этой причине я ушёл в сторону разделения фронтенда и бэкенда. Бэкенд - API, работающее с JSON, а весь фронтенд - это React/Angular/Vue приложение. Валидацию в таком случае надо делать и на фронтенде и на бэкенде, либо только на бэкенде. Конечно, с точки зрения удобства использования вариант валидации на фронтенде и на бэкенде выглядит более интересным, т.к. для валидации не требуется делать запрос на сервер. В то же время тут могут быть сложности с соответствием валидаторов на сервере и фронтенде (если это очень трудоёмко, то можно валидацию оставить только в бэкенде). Плюс такого разделения заключается в том, что вся работа с формами, стилями, виджеты и прочая интерфейсная часть с бэкендом вообще никак не пересекается. Код получается более простым для сопровождения (нет каши), кроме того легко разделяются обязанности.
    Ответ написан
    Комментировать
  • Как исправить подгрузку данных в react-paginate?

    @dimuska139
    Backend developer
    Ответ написан
    Комментировать
  • В чём прикол модулей NestJS?

    @dimuska139
    Backend developer
    Этот декоратор по сути описывает то, от каких модулей зависит текущий модуль, какие в нём контроллеры и сервисы есть - то есть, грубо говоря, описание модуля что ли, его конфигурация. А сам по себе модуль - это совокупность какой-либо логики (сервисов, контроллеров), объединённых по смыслу (находящиеся в одной папке). Что что-то вроде приложений в Django внутри проекта, если имели дело с этим. Это нужно, чтобы проект в кашу не превращался. То есть в вашем случае users и products - это два разных модуля.
    Ответ написан
    Комментировать
  • Стоит ли хранить временные данные непосредственно в Node.js?

    @dimuska139
    Backend developer
    Во-первых, это решение не масштабируемое. Во-вторых, рестарт/падение приложения приведёт к потери этих данных. В остальных случаях можно.
    Ответ написан
    Комментировать
  • Как исправить ошибку в react-paginate?

    @dimuska139
    Backend developer
    Дело в том, что для подсчёта pageCount нужно знать общее число результатов поиска. В data.length не оно, а ровно 10, потому что именно 10 передаётся в параметре per_page в GithubAPI. То есть 10 запросил - 10 получил. Соответственно, все 10 уменьшаются на 1 странице - и пагинация не отображается.

    А репозитории не отображаются потому, что надо вот так:
    useEffect(() => {
        if (user) {
          fetch(
            `//api.github.com/users/${user.login}/repos?page=${currentPage}&per_page=${PER_PAGE}`
          )
            .then((res) => res.json())
            .then(setData);
        }
      }, [user, currentPage]);

    Тогда при изменении переменной user или currentPage будет отрабатывать useEffect
    Ответ написан
  • Стоит ли писать оригинальные текста?

    @dimuska139
    Backend developer
    Насчёт первого вопроса - нет однозначного ответа. Рекомендуются всеми, конечно, оригинальные тексты, но это вовсе не значит, что полный копи-пейст статьи с другого сайта внезапно не попадёт на первое место выдачи по каким-то запросам. По крайней мере, я с таким сталкивался.

    Что бы не быть голословным, вот скриншот выдачи. Сайт coderoad - это, грубо говоря, переведённый через гугл транслейт парсинг stackoverflow. Ну и что мы видим? В выдаче нет stackoverflow (на первой странице по крайней мере), а вот coderoad (считай, copy-paste) есть. При этом если туда перейти, то там есть даже ссылка на первоисточник.

    6090343cedf44250203993.png
    Ответ написан
    Комментировать
  • Как удалить строку из 2-х таблиц одним запросом?

    @dimuska139
    Backend developer
    Повесьте внешний ключ со свойством ON DELETE ... CASCADE на нужный столбец. Тогда СУБД будет автоматически удалять связанные данные из других таблиц.
    Ответ написан
    Комментировать
  • Как сделать, чтобы при выборе адреса из списка менялась гугл карта?

    @dimuska139
    Backend developer
    У Google карт есть геокодер с помощью которого можно по адресу получать координаты. При выборе пункта из списка берёте адрес, суёте его в геокодер, получаете координаты. Ну а дальше центрируете карту в этой точке (см. документацию). Если не хотите каждый раз дёргать геокодер, а адреса в списке не меняются, то можно координаты заранее сохранить и при смене адреса в списке брать их. Но, если не ошибаюсь, Google запрещает это делать в рамках соглашения (но это не точно).
    Ответ написан
    Комментировать
  • Как разместить компонент react на сайт bitrix?

    @dimuska139
    Backend developer
    У функции ReactDOM.render есть второй аргумент в котором вы указываете html-элемент, внутрь которого будет рендерится приложение. Например:
    const container = document.getElementById('calendar');
    ReactDOM.render(
                    <App/>,
                    container
    );

    Соответственно, можно сделать так: при клике на кнопку рисовать на странице элемент с id="calendar" и подключать js-файл собранного приложения. Если элемент с таким id уже существует, то к нему применять стиль display: visible. Тогда React-приложение будет появляться при нажатии на кнопку. Скрывать можно очень просто, путём добавления стиля display: none для элемента с id="calendar".

    P.s. ещё можно поэкспериментировать с вот такой библиотекой.
    Ответ написан
    Комментировать
  • Как с помощью Ansible создать базу данных для PostgreSQL с кодировкой ru_RU.UTF-8?

    @dimuska139 Автор вопроса
    Backend developer
    Может быть, кому-то поможет. Вопрос в итоге решился, но другим способом. Выяснилось, что пересоздавать кластер вовсе не нужно было. Просто после генерации локалей надо перезапустить PostgreSQL и только после этого создавать базу с кодировкой ru_RU.UTF-8. Причём почему-то в моём случае рестарт PostgreSQL через notify после генерации локалей почему-то не помог, и я сделал по-другому: сперва сгенерировал локали, а только потом установил PostgreSQL - и так всё получилось.
    Ответ написан
    Комментировать
  • Как обновляется информация на сайтах?

    @dimuska139
    Backend developer
    Смотря как сайт реализован. По большей части используют реляционные СУБД, так что да - обычные ssl-таблицы. Но данные могут по-разному храниться. Например, в MongoDB или даже просто в обычных текстовых файлах.
    Ответ написан
  • Стоит ли использовать Next.js для крупного ECOM проекта?

    @dimuska139
    Backend developer
    Если фронтенд на React, и при этом нужно, чтобы с сайтом хорошо дружили поисковики, то NextJS обязателен. Да, даже несмотря на то, что гугл давно говорит, что умеет сканировать js сайты. По факту индексирует он их хуже. А другие поисковики вообще с js не дружат.

    какими подводными камнями

    Скорее с летящими в вас камнями. Есть достаточно много людей, которые не хотят использовать React для разработки сайтов и клепают по старинке: весь html генерится на сервере средствами какого-нибудь php + jQuery на фронте. И эти люди будут постоянно швырять в вашу сторону камни, с пеной у рта пытаясь вам доказать, что вы все переусложняете. Но надо понимать, что у крупных интернет-магазинов обычно сложный фронтенд, и пилить его на jQuery или на чистом js - самоубийство, потому что код будет в 99% случаев помойкой.

    А если серьезно, то единственное, что мне в NextJS не понравилось - это роутинг. Но и это субъективно.
    Ответ написан
    Комментировать
  • Redux - показатель выполнения API-запроса?

    @dimuska139
    Backend developer
    А если вот так?

    const INITIAL_STATE = {
      allGamesCollection: [],
      loading: false,
      error: null
    }
    Ответ написан
    5 комментариев
  • Expressjs однопоточен?

    @dimuska139
    Backend developer
    Она будет одинакова, да, но так делать не рекомендую, если вы решили эту переменную использовать как быстрый in-memory кеш. Потому что в таком случае ваше API становится не масштабируемым, т.к. значение переменной A может быть в таком случае разным у разных нод.
    Ответ написан
    3 комментария
  • Как в NestJS сформировать вывод ошибок валидации?

    @dimuska139 Автор вопроса
    Backend developer
    Разобрался, в общем. Нужно просто сделать свой ValidationPipe:
    @Injectable()
    export class ValidationPipe implements PipeTransform<any> {
      async transform(value, metadata: ArgumentMetadata) {
    
        if (!value) {
          throw new BadRequestException('No data submitted');
        }
    
        const { metatype } = metadata;
        if (!metatype || !this.toValidate(metatype)) {
          return value;
        }
        const object = plainToClass(metatype, value);
        console.dir(object);
        const errors = await validate(object);
        if (errors.length > 0) {
          throw new HttpException({message: 'Input data validation failed', errors:  this.buildError(errors)}, HttpStatus.BAD_REQUEST);
        }
        return value;
      }
    
      private buildError(errors) {
        const result = {};
        errors.forEach(el => {
          const prop = el.property;
          Object.entries(el.constraints).forEach(constraint => {
            result[prop] = constraint[0];
          });
        });
        return result;
      }
    
      private toValidate(metatype): boolean {
        const types = [String, Boolean, Number, Array, Object];
        return !types.find((type) => metatype === type);
      }
    }


    И использовать его в контроллере вот так:
    @UsePipes(new ValidationPipe())
    @Post()
    async create(@Body() createPostDto: CreatePostDto) {
      console.dir(createPostDto)
    }


    В строке result[prop] = constraint[0]; 0 не просто так. В constraint[0] находится "ключ" ошибки. Например, "isNotEmpty". То есть по этому ключу можно сделать свой текст ошибки, в том числе и перевод. prop - это название поля, в котором возникла ошибка. А в constraint[1] находится стандартный текст валидатора, в котором фигурирует название поля (мне он не нужен).

    P.s. подсмотрел вот тут.
    Ответ написан
    Комментировать