Проблема с дублированием данных при вызове return вместо reply.send - Fastify
-
Кароче столкнулся с такой проблемой, если вызываю в функции 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" }); } }
-
Во первых ты описал
createNewUser()
как асинхронную функцию, и она у тебя ничего не возвращает, а также ты нигде await не используешь, у тебя тогда и try не будет ничего ловитьПопробуй вместо
userRepository.save(user)
написать асинхронную функцию простую (например таймер), и сделай там console.log(), посмотри сколько сообщений выдаст, сделай такой дебаггинг -
@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); }
-
Пользователь @kirilljs написал в Проблема с дублированием данных при вызове return вместо reply.send - Fastify:
const userService = new UserService();
Лучше не создавать сервис каждый раз в функции, это лишние затраты
-
Кароче как оказалось проблема была в preHandler, у меня в роутинге к регистрации юзера была валидация body:
fastifyInstance.post("/users/register", { preHandler: validateCreateUser }, createNewUser);
В итоге я убрал preHandler, а логи валидации перенес в сервисы.