Nodemailer:无法读取未定义的属性“ then”

时间:2019-08-27 08:43:22

标签: node.js

我正在设置nodemailer以发送电子邮件。所有电子邮件均已正确发送,但有一个我无法解决的错误。错误消息是: TypeError:无法读取未定义的属性“ then”

这是我的代码:

 transporter.sendMail(mailOptions, (error, info) => {
   console.log(mailOptions);
  })
  .then((ok) => {
    return ok;
  })
  .catch((error) => {
    if (error.name = "SequelizeValidationError") {
      let response = Errors.errorResponse(error);
      res.status(422).send(response);
    } else {
      let response = Errors.errorResponse(error);
      res.status(500).send(response);
    }
  });

3 个答案:

答案 0 :(得分:1)

您正在将回调传递给transporter.sendMail(),因此它不会返回承诺。这就是为什么您不能使用.then()的原因。

从他们的文档中:

  

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

您应该做什么:

transporter.sendMail(mailOptions)
  .then((ok) => {
    return ok;
  })
  .catch((error) => {
    if (error.name = "SequelizeValidationError") {
      let response = Errors.errorResponse(error);
      res.status(422).send(response);
    } else {
      let response = Errors.errorResponse(error);
      res.status(500).send(response);
    }
  });

答案 1 :(得分:0)

您已经告诉nodemailer您不希望通过提供回调来实现Promise。您可以

  1. 删除回调并使用Promise:

    transporter.sendMail(mailOptions)
    .then((ok) => {
      console.log(mailOptions);
      return ok;
    })
    .catch((error) => {
      console.log(mailOptions);
      if (error.name = "SequelizeValidationError") {
        let response = Errors.errorResponse(error);
        res.status(422).send(response);
      } else {
        let response = Errors.errorResponse(error);
        res.status(500).send(response);
      }
    });
    

  2. 改为使用回调:

    transporter.sendMail(mailOptions, (error, ok) => {
        console.log(mailOptions);
        if (error) {
          if (error.name = "SequelizeValidationError") {
            let response = Errors.errorResponse(error);
            res.status(422).send(response);
          } else {
            let response = Errors.errorResponse(error);
            res.status(500).send(response);
          }
        }
        else {
          // Do whatever you want with "ok"
        }
    });
    

答案 2 :(得分:0)

尝试在尝试使用时添加async关键字,然后应使用promise应当使用的键

async function sendASNICMAIL() {

 transporter.sendMail(mailOptions, (error, info) => {
    console.log(mailOptions);
}).then((ok) => {
    return ok;
}).catch((error) => {
    if (error.name = "SequelizeValidationError") {
        let response = Errors.errorResponse(error);
        res
            .status(422)
            .send(response);
    } else {
        let response = Errors.errorResponse(error);
        res
            .status(500)
            .send(response);
    }
});

} 尝试这样做并告诉我是否在工作 ]