Quiero ejecutar el código en un .then() después de que se resuelva fetch() , el problema es que mi .then() no se ejecuta después de que se resuelve el método POST , sin embargo, lo hace si se rechaza.
Lo que estoy haciendo es enviar un correo a través de mi servidor usando Nodemailer. Así que no estoy del todo seguro de cuál es el problema, pero tal vez Nodemailer no devuelve una promesa a la llamada o tarda demasiado y, por lo tanto, solo ejecuta .then() si se rechaza. ¿Alguien sabe cuál es el problema y cómo se puede resolver o tal vez si hay formas alternativas en las que puedo ejecutar algún código después de que se haya resuelto fetch() ?
Envío del formulario:
const handleSubmit = (e) => { e.preventDefault(); fetch("http://localhost:4000/send_mail", { method: 'POST', body: formData }).then((res) => { //This does not run on resolve if (res.ok) { } }); }Servidor:
app.post("/send_mail", cors(), async (req, res) => { await transport.sendMail({ from: sender, to: receiver, subject: "Subject", html: ``, attachments: [{ filename: filename, content: content } }) });Envía una respuesta desde tu servidor:
transport.sendMail({ // mailoptions }, (err, data) => { if (err) { console.log(err); res.status(400).send('Error'); } else { res.status(200).send('Success'); } })El problema es que su código del lado del servidor no envía ninguna respuesta, por lo que la solicitud en sí se cuelga infinitamente hasta que la solicitud se agota, ya sea del lado del servidor o del lado del cliente. Por lo tanto, nunca se llamará a then , sino que se producirá un error en algún momento en el lado del cliente.
Su código del lado del servidor debería verse así:
app.post("/send_mail", cors(), async (req, res) => { try { await transport.sendMail({ from: sender, to: receiver, subject: "Subject", html: ``, attachments: [{ filename: filename, content: content } }) res.status(200).send('Success'); } catch (err) { // some kind of error response, you need to decide // which status code is the propper one res.status(500).send('Error'); } });