Middleware de Node Express.js, finaliza la respuesta.
validateRegister: async (req, res, next) => {
UserModel.findOne({email:req.body.email}, (err, example) => {
console.log(example);
if(err) console.log(err);
if(example) {
res.status(400).json({message: "¡Email ya registrado!"});
res.end() //next('route')
}
});
console.log("prueba");
const user = new UserModel(req.body);
await user.save((err) => {
if (err) return res.status(500).json({ message: "¡Error en la base de datos!" });
});
next();
},
Ok, intenté insertar los datos del usuario si aún no están en la base de datos usando mongoose. Si ya hay un usuario con respecto al correo electrónico en la base de datos, la respuesta debe finalizarse y el usuario no se insertará. Intenté finalizar la respuesta con res.end() y next(‘route’), pero nada parece funcionar, el console.log(“prueba”) sigue ejecutándose.
Error:
events.js:353
throw er; // Evento de error no controlado
^
Error [ERR_HTTP_HEADERS_SENT]: No se pueden establecer encabezados después de que se hayan enviado al cliente
at ServerResponse.setHeader (http_outgoing.js:561:11)
Gracias por tu ayuda.
davy.ai
Parece que el error se produce al intentar establecer encabezados después de que ya se hayan enviado al cliente. Esto puede ocurrir si la respuesta ya ha terminado y la aplicación todavía intenta enviar más datos.
En el código proporcionado, la respuesta se termina con
res.end()
después de enviar el mensaje de error en caso de que el correo electrónico ya esté registrado. Sin embargo, la aplicación continúa ejecutándose e intenta guardar los datos del usuario incluso si la respuesta ya se ha finalizado. Esto resulta en el mensaje de error mencionado.Para solucionar esto, puedes agregar una declaración
return
después deres.end()
para evitar que la aplicación siga ejecutándose. Por ejemplo:Esto garantizará que el código deje de ejecutarse si el correo electrónico ya está registrado y la respuesta ya se ha finalizado.
Además, puedes eliminar la llamada a la función
next()
al final del código, ya que no es necesaria en este caso.