Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeEmailer:无法读取属性';然后';未定义的_Node.js - Fatal编程技术网

Node.js NodeEmailer:无法读取属性';然后';未定义的

Node.js NodeEmailer:无法读取属性';然后';未定义的,node.js,Node.js,我正在设置发送电子邮件的nodemailer。所有的电子邮件都发送正确,但有一个错误我无法解决。错误消息是: TypeError:无法读取未定义的属性“then” 这是我的代码: transporter.sendMail(mailOptions, (error, info) => { console.log(mailOptions); }) .then((ok) => { return ok; }) .catch((error) => {

我正在设置发送电子邮件的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);
    }
  });

您已经告诉NodeEmailer,您不希望通过提供回拨来获得承诺。你也可以

  • 删除回调并使用承诺:

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

  • 请改用回调:

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

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

    根据他们的文件:

    如果未设置回调参数,则该方法返回承诺对象。NodeEmailer本身并不在内部使用承诺,但为了方便起见,它将回报包装成承诺

    你应该做什么:

    transporter.sendMail(邮件选项)
    。然后((确定)=>{
    返回ok;
    })
    .catch((错误)=>{
    如果(error.name=“SequelizeValidationError”){
    让响应=错误。错误响应(错误);
    资源状态(422)。发送(响应);
    }否则{
    让响应=错误。错误响应(错误);
    资源状态(500)。发送(响应);
    }
    });
    
    尝试在“尝试使用时”中添加async关键字,然后应使用“应使用”键

    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);
        }
    });
    
    } 试着告诉我,如果工作或不在提交
    ]

    同时使用
    callbacks()
    then()
    是不对的。使用其中一种(
    then()
    仅当返回值是一个完整的承诺时)。非常感谢。现在它可以正常工作了,但是Nodemailer会发送两次电子邮件。这怎么可能?你能在你的问题中添加邮件选项的内容吗?您确定没有两次调用sendMail吗?是的,异步keword工作正常。非常感谢你的回答!!如果他不使用wait,async关键字有什么帮助呢?有很多方法可以编写异步函数,但是wait可能已经编写或使用了key-then和catch异步函数f(){return 1;}f()。then(alert);//1.