nodemailer sendEmail 不等待 Node.js

nodemailer sendEmail doesn't wait in 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 }));
  }
});

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);”之前结束,我得到错误,我得到“消息已成功发送”,然后服务器崩溃! 我错过了什么?

检查文档函数 sendMail 来自 here

的 nodemailer

If callback argument is not set then the method returns a Promise object. Nodemailer itself does not use Promises internally but it wraps the return into a Promise for convenience.

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

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

return await transporter.sendMail(mailOptions);

或者您可以使用 Promise。

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