在AWS Lambda中处理异步代码时有一个常见问题。代码中的关键问题是
forEach
具有异步功能。Lambda不等待
for Each
循环在终止之前完成。
结果是,Lambda函数在启动异步操作后立即完成,而无需等待它们完成。这可能是您在
sesClient.send()
线
要解决此问题,您应该使用
Promise.all
或者在继续之前等待发送每个电子邮件的循环:
以下是如何修改处理程序以等待使用发送所有电子邮件
Promise.all
:
export const handler = async (event) => {
const promises = event.Records.map(async (msg) => {
const args = JSON.parse(msg.body);
const command = new SendEmailCommand({
Source: (args.senderEmailAddr || process.env.DEFAULT_SENDER_ADDRESS),
Destination: { ToAddresses: [args.recipientEmailAddr] },
Message: {
Body: { Text: { Data: args.emailContents } },
Subject: { Data: args.subject },
},
});
try {
const resp = await sesClient.send(command);
console.log(`Email send response ${resp}`);
return resp;
} catch (err) {
console.log(`Failed to send email - ${err}`);
}
});
await Promise.all(promises);
console.log('++++++++++++++++++++++++++++++++');
};
现在,Lambda功能将等待所有电子邮件发送完成,并且您应该在发送电子邮件后看到日志。