我正在使用nodemailer发送邮件。我需要知道是否发送邮件,然后更新我的数据库,但是邮件是在传输器中发送的(我不认为它会返回诺言),这会花费一些时间,因此即使邮件已发送,返回也总是错误的
这是我从其他路线调用的邮件发送文件
//mail_file.js
//imports
sendmail= async(req)=>{
let transporter = nodemailer.createTransport({
//settings
});
var mailOptions = {
//mailoptions
};
let resp=false;
await transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log("error is "+error);
resp =false;
}
else {
console.log('Email sent: ' + info.response);
resp=true;
}
});
return resp
}
module.exports = sendmail;
这是我称之为的路线:
//imports including the mail_file.js
//somepath.js
router.post('/somepath',(req,res,next)=>{
sendresetmail=async()=>
{
parameters={
//some email parameters
}
return await sendmail(params);
}
sendmail()
.then(response=>{
//response is always false even when the mail is sent
})
.catch(err=>{
//error
})
})
当我记录邮件信息时,它是在somepath.js中记录sendmail函数的响应之后
答案 0 :(得分:2)
所有公共Nodemailer方法都支持回调和Promises(如果 省略回调)。如果您至少需要Node v8.0.0, 想要对Nodemailer使用async..await
可以在此处找到示例:https://nodemailer.com/about/#example
答案 1 :(得分:1)
transporter.sendMail不返回承诺,它使用回调函数。更改代码
return new Promise((resolve,reject)=>{
let transporter = nodemailer.createTransport({
//settings
});
var mailOptions = {
//mailoptions
};
let resp=false;
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log("error is "+error);
resolve(false); // or use rejcet(false) but then you will have to handle errors
}
else {
console.log('Email sent: ' + info.response);
resolve(true);
}
});
})
}
正如我之前说的,transport.sendMail()函数使用回调函数,这就是为什么您不能在那里使用await的原因,但是您可以围绕它编写包装函数,以便可以在需要更多可读性和功能的函数中使用await干净的代码。只要考虑下面的例子
async function wrapedSendMail(mailOptions){
return new Promise((resolve,reject)=>{
let transporter = nodemailer.createTransport({//settings});
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log("error is "+error);
resolve(false); // or use rejcet(false) but then you will have to handle errors
}
else {
console.log('Email sent: ' + info.response);
resolve(true);
}
});
}
})
现在,您可以在以下其他函数中使用这个wrapdSendMail函数, sendmail = async(req)=> {
var mailOptions = {
//mailoptions
};
let resp= await wrapedSendMail(mailOptions);
// lo or process resp;
return resp;
}