Перейти к содержанию
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
Логотип бренда
Категории
  1. Главная
  2. Категории
  3. Бекенд, разработка серверов
  4. Fastify
  5. Проблема с дублированием данных при вызове return вместо reply.send - Fastify

Проблема с дублированием данных при вызове return вместо reply.send - Fastify

Запланировано Прикреплена Закрыта Перенесена Fastify
5 Сообщения 2 Постеры 64 Просмотры 1 Watching
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • kirilljsK Не в сети
    kirilljsK Не в сети
    kirilljs
    js
    написал в отредактировано kirilljs
    #1

    Кароче столкнулся с такой проблемой, если вызываю в функции retrun newUser за место reply.send, то в БД данные отправляются 2 раза, тем самым создавая в моем случае дубликат пользователя.

    Хотя мне в принципе return и нахой не нужен, но все равно интересно почему так.🙄

    const createNewUser = async (request: FastifyRequest, reply: FastifyReply) => {
        const user = request.body;
        const userRepository = AppDataSource.manager.getRepository(User);
    
        try {
            userRepository.save(user).then((newUser) => {
                reply.status(201).send({ message: "User created successfully", });
                // ТУТ
                return newUser;
            }).catch((err) => {
                console.error("Error creating new user:", err);
                reply.status(500).send({ message: "Internal server error" });
            });
        } catch (error) {
            console.error("Database query error:", error);
            reply.status(500).send({ message: "Internal server error" });
        }
    }
    
    1 ответ Последний ответ
    1
    • JspiJ Не в сети
      JspiJ Не в сети
      Jspi
      js
      написал в отредактировано
      #2

      Во первых ты описал createNewUser() как асинхронную функцию, и она у тебя ничего не возвращает, а также ты нигде await не используешь, у тебя тогда и try не будет ничего ловить

      Попробуй вместо userRepository.save(user) написать асинхронную функцию простую (например таймер), и сделай там console.log(), посмотри сколько сообщений выдаст, сделай такой дебаггинг

      kirilljsK 1 ответ Последний ответ
      0
      • JspiJ Jspi

        Во первых ты описал createNewUser() как асинхронную функцию, и она у тебя ничего не возвращает, а также ты нигде await не используешь, у тебя тогда и try не будет ничего ловить

        Попробуй вместо userRepository.save(user) написать асинхронную функцию простую (например таймер), и сделай там console.log(), посмотри сколько сообщений выдаст, сделай такой дебаггинг

        kirilljsK Не в сети
        kirilljsK Не в сети
        kirilljs
        js
        написал в отредактировано
        #3

        @Jspi Бля, я кароче переписал уже это очко, теперь функция выглядит так:

        const createNewUser = async (request: FastifyRequest, reply: FastifyReply) => {
            try {
                const userService = new UserService();
                const newUser = await userService.createUser(request.body);
                reply.status(201).send(newUser);
            } catch (error) {
                console.error("Error creating user:", error);
                reply.status(400).send({ message: error.message });
            }
        }
        

        Сервис вытащил отдельным слоем, без then:

        async createUser(userData: Partial<User>): Promise<User> {
                const existingUser = await this.userRepository.findOneByEmail(userData.email);
                if (existingUser) {
                    throw new Error('User with this email already exists.');
                }
                
                const user = new User();
                Object.assign(user, userData);
                return this.userRepository.save(user);
            }
        
        1 ответ Последний ответ
        0
        • JspiJ Не в сети
          JspiJ Не в сети
          Jspi
          js
          написал в отредактировано Jspi
          #4

          Пользователь @kirilljs написал в Проблема с дублированием данных при вызове return вместо reply.send - Fastify:

          const userService = new UserService();

          Лучше не создавать сервис каждый раз в функции, это лишние затраты

          1 ответ Последний ответ
          0
          • kirilljsK Не в сети
            kirilljsK Не в сети
            kirilljs
            js
            написал в отредактировано
            #5

            Кароче как оказалось проблема была в preHandler, у меня в роутинге к регистрации юзера была валидация body:

            fastifyInstance.post("/users/register", { preHandler: validateCreateUser }, createNewUser);
            

            В итоге я убрал preHandler, а логи валидации перенес в сервисы.

            1 ответ Последний ответ
            👍
            0

            • Войти

            • Нет учётной записи? Зарегистрироваться

            • Войдите или зарегистрируйтесь для поиска.
            • Первое сообщение
              Последнее сообщение
            0
            • Категории
            • Последние
            • Метки
            • Популярные
            • Пользователи
            • Группы