我试图用nodemailer设置一个非常简单的联系表格,它工作得很好,但我的问题是,它不处理错误。页面应该重定向,如果抛出一个错误,但相反,重定向不会发生,应用程序停止运行。我无法理解为什么会发生这种情况。这是我的代码。
if (req.method === 'POST') {
const name = req.body.name;
const email = req.body.email;
const msg = req.body.message;
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'myemail', // left out here
pass: process.env['GMAIL_PASS']
}
});
const mailOptions = {
from: 'myemail', // left out here
to: 'myemail', // left out here
subject: 'Portfolio Inquiry',
text: `
Name: ${name}
Email: ${email}
Message:${msg}`
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
// If an error is thrown, it should redirect back to the page with a fail message
return res.redirect('/about?send=fail#contact');
} else {
return res.redirect('/about?send=success#contact');
}
});
}
如果我在脚本中引入了一个错误,注释了一些重要的东西,或者只是抛出了一个错误,就像我说的那样,错误处理块中的 sendMail
回调没有任何作用。正如我所说的,它确实能正常工作并发送邮件,但如果有什么地方出了问题,我肯定想让我的用户知道。谁能帮助我了解如何纠正这个问题?
我终于自己想出了一个解决方案。下面是一个包装函数。
function sendEmail(req) {
const name = req.body.name;
const email = req.body.email;
const msg = req.body.message;
const transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 587,
secure: false,
service: 'gmail',
auth: {
user: //left out,
pass: process.env['GMAIL_PASS']
}
});
const mailOptions = {
from: //left out
to: //left out
subject: 'Portfolio Inquiry',
text: `
Name: ${name}
Email: ${email}
Message:
${msg}`};
return transporter.sendMail(mailOptions);
}
然后是函数调用
try {
await sendEmail(req);
return res.redirect('/about?send=success#contact')
} catch (err) {
return res.redirect('/about?send=fail#contact')
}
因为... sendMail
当没有给定回调时,函数会返回一个承诺,你可以在它的 try...catch
块。