Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
exlends
Категории
  1. Home
  2. Categories
  3. Бекенд, разработка серверов
  4. Fastify
  5. Проблема с дублированием данных при вызове return вместо reply.send - Fastify

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

Scheduled Pinned Locked Moved Fastify
5 Posts 2 Posters 78 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • kirilljsxK Offline
    kirilljsxK Offline
    kirilljsx
    js
    wrote on last edited by kirilljsx
    #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 Reply Last reply
    1
    • JspiJ Offline
      JspiJ Offline
      Jspi
      js
      wrote on last edited by
      #2

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

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

      kirilljsxK 1 Reply Last reply
      0
      • JspiJ Jspi

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

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

        kirilljsxK Offline
        kirilljsxK Offline
        kirilljsx
        js
        wrote on last edited by
        #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 Reply Last reply
        0
        • JspiJ Offline
          JspiJ Offline
          Jspi
          js
          wrote on last edited by Jspi
          #4

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

          const userService = new UserService();

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

          1 Reply Last reply
          0
          • kirilljsxK Offline
            kirilljsxK Offline
            kirilljsx
            js
            wrote on last edited by
            #5

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

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

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

            1 Reply Last reply
            👍
            0

            Категории

            • Главная
            • Новости
            • Фронтенд
            • Бекенд
            • Языки программирования

            Контакты

            • Сотрудничество
            • info@exlends.com
            • Наш чат
            • Наш ТГ канал

            © 2024 - 2025 ExLends, Inc. Все права защищены.

            Политика конфиденциальности
            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups