如何将异步函数返回值传入Nodemailer Transporter?
问题解决方法
你的错误根源在于异步操作的作用域问题:emailEnd和passEnd只在then的回调函数内部有效,回调外的auth配置根本访问不到这两个变量;而且nodemailer.createTransport需要直接传入配置对象,不能传入Promise。
正确的做法是先等待异步获取到密钥,再创建Transporter,具体代码如下:
async function accessSecretVersion() { const [version1] = await client.accessSecretVersion({ name: email, }); const [version2] = await client.accessSecretVersion({ name: pass, }); return { user: version1.payload.data.toString(), pass: version2.payload.data.toString() }; } // 封装成异步函数,确保拿到密钥后再创建transporter async function createEmailTransporter() { const { user: emailEnd, pass: passEnd } = await accessSecretVersion(); return nodemailer.createTransport({ host: 'email host', port: port, auth: { user: emailEnd, pass: passEnd, }, }); } // 使用的时候要await这个函数,确保transporter已初始化 async function sendEmail() { const transporter = await createEmailTransporter(); // 这里写发送邮件的逻辑,示例: const info = await transporter.sendMail({ from: emailEnd, to: 'recipient@example.com', subject: 'Test Email', text: 'Hello World!' }); console.log('Email sent:', info.messageId); } // 调用发送邮件函数 sendEmail().catch(err => console.error(err));
关键说明:
- 用
await等待accessSecretVersion()的结果,同步拿到邮箱和密码,避免回调嵌套导致的作用域隔离问题。 - 把创建Transporter的逻辑放在异步函数里,确保只有拿到密钥后才初始化Transporter。
- 所有依赖Transporter的操作(比如发送邮件)都要放在异步函数中,并用
await获取Transporter实例。
如果你的代码运行在Node.js 14.8+环境中,还可以用顶层await简化写法:
async function accessSecretVersion() { const [version1] = await client.accessSecretVersion({ name: email, }); const [version2] = await client.accessSecretVersion({ name: pass, }); return { user: version1.payload.data.toString(), pass: version2.payload.data.toString() }; } // 顶层await直接获取密钥 const { user: emailEnd, pass: passEnd } = await accessSecretVersion(); const transporter = nodemailer.createTransport({ host: 'email host', port: port, auth: { user: emailEnd, pass: passEnd, }, }); // 后续使用transporter发送邮件 transporter.sendMail({ // 邮件配置内容 }).then(info => console.log('Sent:', info)).catch(err => console.error(err));
内容的提问来源于stack exchange,提问作者JohnM
相关产品推荐
相关产品推荐

