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.

Express/Nodemailer: enviar información al navegador después de enviar el correo electrónico.

Soy un traductor de español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código y la salida en markdown.

“Estoy muy nuevo en Express y creo que estoy luchando con algo que no es tan difícil…

Tengo una función llamada sendEmail.

exports.sendEmail = async (req, res) => {
const transport = nodemailer.createTransport({
host: process.env.MAIL_HOST,
port: process.env.MAIL_PORT,
secure: false,
auth: {
user: process.env.MAIL_USER,
pass: process.env.MAIL_PASSWORD,
},
tls: {
rejectUnauthorized: false,
},
});

await transport.sendMail(
{ body },
(err, info) => {
console.log(err);
console.log(info);
// aquí está el problema
if (err) {
res.status(200).json({ msg: ‘error’ });
throw err;
} else {
res.status(200).json({ msg: ‘el mensaje ha sido enviado’ });
}
}
);
}

Esta función funciona bien: se envía el correo electrónico. Pero lo que quiero lograr es enviar información al navegador con la información ‘se envió’ o ‘error’.

En el frontend tengo este código:

await axios.all([
axios.post(${process.env.REACT_APP_DOMAIN}/api/send-email, {
data,
}),

axios
.get(${process.env.REACT_APP_DOMAIN}/api/send-email)
.then((res) => {
console.log(res);
}),
]);

axios.post funciona bien, pero axios.get no. La respuesta que obtengo no contiene la información que quiero.

¿Alguien podría explicarme cómo enviar los datos que necesito después de que se envíe el correo electrónico?

Gracias.”

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la solicitud axios.get. Esta no es la forma correcta de recuperar datos del servidor después de enviar el correo electrónico.

    Dado que deseas enviar una respuesta al navegador con “enviado” o “error”, debes modificar tu código del backend eliminando la solicitud axios.get y simplemente actualizando el objeto de respuesta en función de si hay un error o no.

    Aquí tienes una versión actualizada de la función sendEmail que debería funcionar:

    exports.sendEmail = async (req, res) => {
      const transport = nodemailer.createTransport({
        host: process.env.MAIL_HOST,
        port: process.env.MAIL_PORT,
        secure: false,
        auth: {
          user: process.env.MAIL_USER,
          pass: process.env.MAIL_PASSWORD,
        },
        tls: {
          rejectUnauthorized: false,
        },
      });
    
      try {
        await transport.sendMail(body);
        res.status(200).json({ msg: 'el mensaje ha sido enviado' });
      } catch (err) {
        console.log(err);
        res.status(500).json({ msg: 'error' });
      }
    };
    

    Con este nuevo código, el objeto de respuesta contendrá “el mensaje ha sido enviado” o “error” según el resultado de la función transport.sendMail.

    En tu código frontend, luego puedes acceder al objeto de respuesta desde la llamada axios.post de esta manera:

    const response = await axios.post(`${process.env.REACT_APP_DOMAIN}/api/send-email`, {
      data,
    });
    
    console.log(response.data.msg); // mostrará "el mensaje ha sido enviado" o "error"
    

    Esto debería permitirte obtener los datos de respuesta que necesitas desde el backend después de enviar el correo electrónico.

Comments are closed.