gpt4 book ai didi

node.js - 使用 Async/Await 的 Nodemailer 电子邮件确认

转载 作者:行者123 更新时间:2023-12-02 18:34:03 24 4
gpt4 key购买 nike

我正在使用nodemailer发送邮件。我需要知道邮件是否已发送,然后更新我的数据库,但邮件是在传输器中发送的(我认为不会返回 promise ),这需要时间,因此返回总是错误的,即使邮件已发送.

这是我从其他路由调用的邮件发送文件

// 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;

当我记录邮件信息时,它是在 somepath.js 中记录 sendmail 函数的响应之后

最佳答案

Nodemailer v6.4.8 支持同步版本和异步版本的 sendMail.sendMail(mailOptions: Mail.Options, callback: (err: Error | null, info: SentMessageInfo) => void): void; sendMail(mailOptions: Mail.Options): Promise;

这个答案仍然可以帮助那些需要了解如何 promise 使用回调的函数的人。链接解释相同内容的文章 https://letsdqode.blogspot.com/2022/01/using-callbacks-with-async-await-or.html

原答案:Transporter.sendMail 不返回 promise ,它使用回调函数。更改您的代码

  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() 函数使用回调,这就是为什么你不能在那里使用 wait 的原因。但是你可以在它周围编写一个包装函数,以便你可以在需要更多可读性和干净的代码。只需考虑以下示例

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

现在您可以在其他函数中使用此wrappedSendMail函数,如下所示,

 sendmail= async(req)=>{      
var mailOptions = {
//mailoptions
};
let resp= await wrapedSendMail(mailOptions);
// log or process resp;
return resp;
}

关于node.js - 使用 Async/Await 的 Nodemailer 电子邮件确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com