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