Creé un formulario de contacto que envía una solicitud de obtención a una ruta que he alojado localmente desde un servidor de nodo (express). Envío la solicitud de obtención cuando se hace clic en un elemento en el dom.
($(document).ready(function () { $('#sendEmail').click((e) => { e.preventDefault(); let name = $('#name').val(); let email = $('#email').val(); $.get("http://localhost:3000/send", {name: name, email: email}) .done(() => { alert('success!'); }) .fail(() => { alert('That did not work'); }) })($)El servidor del nodo genera un correo electrónico basado en la información que se recopila del cliente. La buena noticia es que el correo electrónico que se genera funciona perfectamente y se envía a mi cuenta de gmail usando nodemailer .
app.get('/send', (req, res) => { const mailOptions = { name: req.query.name, email: req.query.email, message: req.query.message, to: "", from: req.query.name, text: "" } smtpTransport.sendMail(mailOptions, (error, response) => { if (error) { console.log(error); response.end('error'); } else { console.log('Email sent!'); response.end('sent') } }) })Todo es exitoso en el lado del servidor, pero no se ejecuta ningún código del lado del cliente después de eso. Ni mi función $.done() ni mi función $.fail() terminan ejecutándose. ¿Qué debo hacer para poder ejecutar el código del lado del cliente después de que el correo electrónico se envíe (o no se envíe)?
Porque no respondes el resultado al cliente.
Necesita llamar a 'res' en lugar de 'response' en la devolución de llamada de 'sendMail':
app.get('/send', (req, res) => { const mailOptions = { name: req.query.name, email: req.query.email, message: req.query.message, to: "", from: req.query.name, text: "" } smtpTransport.sendMail(mailOptions, (error, response) => { if (error) { console.log(error); //response.end('error'); res.end('error'); // <===================== } else { console.log('Email sent!'); //response.end('sent') res.end('Email sent!'); // <===================== } }) })