为什么错误处理在 Nodemailer 中不起作用?

Mic*_*der 9 javascript node.js express nodemailer

我正在尝试使用 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');
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

如果我通过注释掉一些重要的内容或只是抛出错误来向脚本中引入错误,正如我所说,回调中的错误处理块sendMail不会执行任何操作。正如我所说,它确实可以正常工作并发送电子邮件,但如果出现问题,我绝对希望我的用户知道。谁能帮助我了解如何纠正这个问题?

Mic*_*der 6

我终于自己找到了解决方案。这是一个包装函数:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后函数调用:

try {
   await sendEmail(req);
   return res.redirect('/about?send=success#contact')
} catch (err) {
   return res.redirect('/about?send=fail#contact')
}
Run Code Online (Sandbox Code Playgroud)

由于该sendMail函数在未给出回调时返回一个 Promise,因此您可以在try...catch块中调用它。