【问题标题】:nodemailer sendEmail doesn't wait in Node.jsnodemailer sendEmail 不在 Node.js 中等待
【发布时间】:2022-04-14 04:03:54
【问题描述】:

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

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 }));
  }
});

sendEmail.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!");
    }
  });
};

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

【问题讨论】:

  • sendEmail 里面没有awaits,你觉得它会等什么?如果 nodemailer 本身不支持 promise,请查找“promisify”。

标签: node.js async-await nodemailer


【解决方案1】:

您好,您可以将 Transporter sendMail 更改为:

return await transporter.sendMail(mailOptions);

或者你可以使用 Promise。

【讨论】:

  • 谢谢我的朋友。
【解决方案2】:

here的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);
};

【讨论】:

  • 谢谢我的朋友。
【解决方案3】:
const handler = async ({ subject, name, body, contact }) => {
  const transporter = nodemailer.createTransport({
    service: "zoho",
    // Disable MFA here to prevent authentication failed: https://accounts.zoho.com/home#multiTFA/modes
    // ********************* OR *****************
    // set up Application-Specific Passwords here: https://accounts.zoho.com/home#security/device_logins
    auth: { user: process.env.NEXT_PUBLIC_EMAIL_ADDRESS, pass: process.env.NEXT_PUBLIC_EMAIL_PASSWORD },
  });

  return transporter
    .sendMail(mailOptions({ subject, name, body, contact }))
    .then((info) => {
      if (process.env.NODE_ENV !== "production") console.log("Email sent: " + info.response);
      return true;
    })
    .catch((err) => {
      if (process.env.NODE_ENV !== "production") console.log("error sending mail", err);
      return false;
    });
};

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 2012-02-11
    • 2021-11-23
    • 2023-03-05
    • 2017-12-21
    • 1970-01-01
    • 2019-01-13
    • 2019-01-18
    相关资源
    最近更新 更多