首页 > 解决方案 > nodemailer sendEmail 不在 Node.js 中等待

问题描述

当我向我的端点发出请求时,只有在发送电子邮件时才需要获得成功的响应!否则,它应该抛出一个错误:

myendpoint.js

    router.post("/", upload.none(), async (req, res) => {
    try {
    let body = JSON.parse(req.body.contact);

    await getDb("messages").insertOne({
      name: body.name,
      email: body.email,
      phone: body.phone,
      subject: body.subject,
      message: body.message,
    });

    await sendEmail(body);

    res.send(
      JSON.stringify({
        success: true,
        msg: "Message has been sent successfully",
      })
    );
  } catch (err) {
    res.send(JSON.stringify({ success: false, msg: err }));
  }
});

发送电子邮件.js

    const sendEmail = async function (props) {
    const transporter = nodemailer.createTransport({
    service: process.env.EMAIL_SERVICE,
    host: process.env.EMAIL_HOST,
    auth: {
      user: process.env.EMAIL_FROM,
      pass: process.env.EMAIL_PASS,
    },
  });
  const mailOptions = {
    from: process.env.EMAIL_FROM,
    to: process.env.EMAIL_TO,
    name: props.name,
    email: props.email,
    phone: props.phone,
    subject: props.subject,
    text: props.message,
  };
  transporter.sendMail(mailOptions, function (error, info) {
    if (error) {
      throw new Error("Message did Not send!");
    }
  });
};

问题出现在“等待 sendEmail(body);”之前 结束,我得到错误,我得到“消息已成功发送”,然后服务器崩溃!我错过了什么?

标签: node.jsasync-awaitnodemailer

解决方案


在此处检查来自 nodemailer 的文档功能sendMail

如果未设置回调参数,则该方法返回一个 Promise 对象。Nodemailer 本身并不在内部使用 Promises,但为了方便起见,它会将返回值包装到 Promise 中。

const sendEmail = async function (props) {
    const transporter = nodemailer.createTransport({
        service: process.env.EMAIL_SERVICE,
        host: process.env.EMAIL_HOST,
        auth: {
            user: process.env.EMAIL_FROM,
            pass: process.env.EMAIL_PASS,
        },
    });
    const mailOptions = {
        from: process.env.EMAIL_FROM,
        to: process.env.EMAIL_TO,
        name: props.name,
        email: props.email,
        phone: props.phone,
        subject: props.subject,
        text: props.message,
    };
    // remove callback and function sendMail will return a Promise
    return transporter.sendMail(mailOptions);
};

推荐阅读