Estoy trabajando en un sistema de me gusta/no me gusta en una API que funciona con mongoDB y nodejs y se supone que el usuario puede realizar estas acciones:
La lógica del sistema me gusta/no me gusta
Logré que al usuario le gustara la salsa, cancelara su me gusta y no le gustara la salsa.
Pero estoy completamente bloqueado en la cancelación de No me gusta porque cuando intento usar nuevamente el método updateOne en la condición en la que tenemos que cancelar Me gusta / No me gusta, tengo este error:
No se pueden establecer encabezados después de que se envían al cliente
¿Cómo podría mejorar el código?
Estoy aprendiendo poco a poco a usar los comandos del backend y aquí estoy frente a una pared.
El error que está recibiendo: Cannot set headers after they are sent to the client , se debe a que está intentando enviar dos respuestas HTTP para la misma solicitud, en este bloque:
if(likeStatus === 0) { Sauces.updateOne({_id: req.params.id}, {$inc:{likes:-1}, $pull: {usersLiked:userIdentifiant}}) .then(() => res.status(201).json({message: "Like has been canceled"})) .catch(error => res.status(400).json(error)) Sauces.updateOne({_id: req.params.id}, {$inc:{dislikes:+1}, $pull: {usersDisliked:userIdentifiant}}) .then(() => res.status(201).json({message: "Dislike has been canceled"})) .catch(error => res.status(400).json(error)) }Debe esperar a que se completen las operaciones de actualización y luego enviar una única respuesta. Por ejemplo, puedes encadenar las promesas así:
if (likeStatus === 0) { Sauces.updateOne({ _id: req.params.id }, { $inc: { likes: -1 }, $pull: { usersLiked: userIdentifiant } }) .then(() => { return Sauces.updateOne( { _id: req.params.id }, { $inc: { dislikes: +1 }, $pull: { usersDisliked: userIdentifiant } } ); }) .then(() => { res.status(201).json({ message: ['Like has been canceled', 'Dislike has been canceled'] }); }) .catch((error) => res.status(400).json(error)); }o incluso mejor ejecútelos en paralelo usando Promise.all()