node.js - 异步for循环不将sqs消息放入队列
问题描述
我正在尝试在 Lambda 函数内部运行一个 for 循环,该循环将解析 SQS 消息并将其发送到 certai 队列。目前它正在运行 for 循环并正确创建参数(我通过日志记录检查)并且在 for 循环之外/之后运行一条日志消息,说明 lambda 已完成。
问题是 SQS 消息没有被发送和/或到达 SQS 队列。
我没有包含 lambda 函数的其余部分,因为它只是噪音并且与问题无关,因为它已经正常运行,唯一的问题是 sqs 消息。
for (var i = 0; i < dogs.length; i++) {
let MessageBody = JSON.stringify(dogs[i]);
let params = {
MessageBody,
QueueUrl: process.env.serviceQueue,
DelaySeconds: 0
};
sqs.sendMessage(params, function(err, data) {
if (err) {
logger.error(`sqs.sendMessage: Error message: ${err}`);
} else {
let stringData = JSON.stringify(data);
logger.info(`sqs.sendMessage: Data: ${stringData}`);
}
});
}
解决方案
迭代多个异步请求,并使用回调是灾难和混乱代码的秘诀。我推荐以下(使用异步/等待)
await Promise.all(dogs.map(async (dog) => {
let params = {
MessageBody: JSON.stringify(dog),
QueueUrl: process.env.serviceQueue,
DelaySeconds: 0
}
let data = await sqs.sendMessage(params).promise().catch(err => {
logger.error(`sqs.sendMessage: Error message: ${err}`);
});
logger.info(`sqs.sendMessage: Data: ${JSON.stringify(data)}`);
}));
推荐阅读
- cors - 400 错误请求响应调用 web api localhost/token url 以生成令牌
- windows - Delphi6 应用程序抛出“运行时错误 217”
- regex - 使用 ARRAYFORMULA() 获取每行的 MAX()
- angular - 在 app.module.ts 中添加导入 BrowserAnimation 模块时,UI 加载奇怪
- vb.net - 在 VB.NET 中从 dotx 文件生成 pdf 文件
- python - 如何保存 .qcut() 的间隔?
- arrays - 如何在 React 中遍历 JSON 数组并根据 API 响应值显示特定信息?
- c# - 来自 IConfigurationSection 集合的 AutoMapper 映射
- php - Wordpress:如何在标签或类别描述中允许 PHP?
- android - 是否可以在 android 的 infoWindow 中添加操作?