首页 > 解决方案 > 异步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}`);
                }
            });
    }

标签: node.jsfor-loopaws-lambda

解决方案


迭代多个异步请求,并使用回调是灾难和混乱代码的秘诀。我推荐以下(使用异步/等待)

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

推荐阅读