You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的Lambda函数单次调用会向SQS队列发送两次消息?

问题原因分析

根本原因是代码同时使用了回调和Promise两种方式调用AWS SQS的sendMessage方法,导致单次函数执行触发了两次独立的消息发送请求。

AWS JavaScript SDK v2的服务方法逻辑如下:

  1. 调用sqs.sendMessage(params, 回调函数)时,只要传入了回调参数,SDK会立即执行一次SQS API请求,请求返回后自动执行你传入的回调函数,输出第一条Success日志。
  2. 你后续又链式调用了.promise()方法,AWS SDK的Request对象调用.promise()时会再次触发一次独立的SQS API请求,所以会发送第二条消息。
    另外你写的.promise(console.log("_________in promise___________"))属于错误写法:.promise()方法不接收任何参数,这里的console.log会在调用.promise()时同步执行,不是请求的回调逻辑。

修复方案

二选一即可,不要混用两种异步处理方式:

方案1:仅使用回调方式

去掉await和.promise()调用:

console.log('_________CALL_______________');
console.log("_________in promise___________");
sqs.sendMessage(params, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data.MessageId ,data);
  }
  console.log("___end")
});

方案2:仅使用async/await + Promise方式(更推荐)

去掉sendMessage的回调参数,把结果处理逻辑放到await之后:

console.log('_________CALL_______________');
console.log("_________in promise___________");
try {
  const r = await sqs.sendMessage(params).promise();
  console.log("Success", r.MessageId ,r);
} catch (err) {
  console.log("Error", err);
}
console.log("___end")

内容的提问来源于stack exchange,提问作者jchenaud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:27:03