es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 de res.end() para evitar que la aplicación siga ejecutándose. Por ejemplo:

    if (ejemplo) {
        res.status(400).json({message: "¡Email ya registrado!"});
        return res.end();
    }
    

    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.

Comments are closed.