Node.js使用nodemailer+AWS SES发邮件的异步函数无法正确返回值如何解决
问题原因
你当前的函数返回null是因为transporter.sendMail是异步回调执行的逻辑,你定义的async函数没有等待这个异步操作完成就直接return了sendResult,此时回调还没触发,sendResult还是初始的null值。
解决方案
nodemailer的sendMail方法本身支持Promise调用,你不需要手动写回调包装,直接用await接收结果即可,修改后的代码如下:
const nodemailer = require("nodemailer"); const AWS = require("aws-sdk"); require("dotenv").config(); exports.sendMail = async (obj) => { try { const transporter = nodemailer.createTransport({ SES: new AWS.SES({ apiVersion: "2010-12-01", accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, region: process.env.AWS_REGION, }), }); const info = await transporter.sendMail({ from: process.env.MAIL_SENDER_ADDRESS, to: obj.receiver, subject: "Mail send success!", text: "Hello World" }); // 发送成功逻辑 console.log("sendEmail: " + JSON.stringify(info.envelope)); console.log(info.messageId); return true; } catch (err) { // 发送失败逻辑 console.log(err); return false; } };
补充说明
如果你遇到其他仅支持回调的异步API,也可以手动封装Promise实现同样的效果,示例逻辑如下:
// 手动封装回调为Promise的通用写法 const sendResult = await new Promise((resolve) => { transporter.sendMail({/* 邮件配置 */}, (err, info) => { if (err) { console.log(err); resolve(false); } else { console.log("sendEmail: " + JSON.stringify(info.envelope)); console.log(info.messageId); resolve(true); } }) }) return sendResult;
内容的提问来源于stack exchange,提问作者Gary Lee
相关产品推荐
相关产品推荐

