Tengo una aplicación con un frontend React y un backend Express. Tengo una configuración de formulario con Nodemailer que envía un correo electrónico después de que el usuario envía el formulario. Quiero activar una redirección después del envío dependiendo de si el correo electrónico se envió correctamente o no. Los correos electrónicos se envían bien, sin embargo, la redirección no. ¿Alguien sabe lo que estoy haciendo mal?
Gestor de solicitudes posteriores
app.post('/sendApplication', cpUpload, async (req) => { await sendMail(req.files['essay'][0], req.files['recLetter1'][0], req.files['recLetter2'][0], req.body) })Código de Nodemailer (Mis opciones de correo también están aquí, pero las omití porque son irrelevantes)
const sendMail = async () => { await transporter.sendMail(mailOptions, (error, info) => { if (error) { console.log(error) res.sendStatus(500) } else { console.log("Message Sent " + info.response) res.sendStatus(200) } }) }Código de interfaz
handleRedirect = (res) => { if (res.status === 200) { this.props.history.push('/success') } else { this.props.history.push('/applicationerror') } } handleSubmit = async (e) => { e.preventDefault() let formData = new FormData() for (let i in this.state.formValues) { formData.append(i, this.state.formValues[i]) } formData.append('essay', document.getElementById('essay').files[0]) formData.append('recLetter1', document.getElementById('recLetter1').files[0]) formData.append('recLetter2', document.getElementById('recLetter2').files[0]) fetch('/sendApplication', { method: 'POST', body: formData }).then((res) => { this.handleRedirect(res) }) }Tienes varios problemas en este código:
sendMail fuera de su controlador, no tiene idea de qué es res .transporter.sendMail no devuelve una Promesa, por lo tanto, no puede esperarla, pero aún puede prometerla.multer y el body de la solicitud a sendMail , pero en realidad no está tomando ningún parámetro. app.post('/sendApplication', cpUpload, async (req) => { try { await sendMail() res.sendStatus(200) } catch(e){ console.log(e) res.sendStatus(500) } })enviar correo
const sendMail = () => { ... ... return new Promise((resolve, reject) => { transporter.sendMail(mailOptions, function (err) { if (err) reject(err) else resolve() }) }) }history.push para cambiar la ruta, sino algo como react-router para realizar la navegación del lado del cliente.