javascript - 通过lambda函数向SQS发送消息时如何插入

标签 javascript node.js lambda aws-lambda

我正在尝试使用 Lambda 向 SQS 队列发送消息:

这是我的代码:

var QUEUE_URL = 'https://us-west-2.queue.amazonaws.com/123456789/ntech-event-processing-dev.fifo';
var AWS = require('aws-sdk');
var sqs = new AWS.SQS({region : 'us-west-2'});

exports.handler = function(event, context) {
  var params = {
    MessageBody: JSON.stringify(event),
    QueueUrl: QUEUE_URL
  };
  sqs.sendMessage(params, function(err,data){
    if(err) {
      console.log('error:',"Fail Send Message" + err);
      context.done('error', "ERROR Put SQS");  // ERROR with message
    }else{
      console.log('data:',data.MessageId);
      context.done(null,'');  // SUCCESS 
    }
  });
}

这是我的测试数据(JSON),请注意我已经在那里定义了 MessageGroupId。

{
  "MessageGroupId": "1",
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

我收到以下错误:

2020-04-16T17:40:37.604Z    fa709a07-0bcd-4b17-a48b-341a984aec88    INFO    error: Fail Send MessageMissingParameter: The request must contain the parameter MessageGroupId.
2020-04-16T17:40:37.661Z    fa709a07-0bcd-4b17-a48b-341a984aec88    ERROR   Invoke Error    {"errorType":"Error","errorMessage":"error","stack":["Error: error","    at _homogeneousError (/var/runtime/CallbackContext.js:13:12)","    at postError (/var/runtime/CallbackContext.js:30:54)","    at done (/var/runtime/CallbackContext.js:57:7)","    at Object.done (/var/runtime/CallbackContext.js:105:16)","    at Response.<anonymous> (/var/task/index.js:13:15)","    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:364:18)","    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)","    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)","    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)","    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)"]}

我看过: Lambda : Send a message to SQS 和 奥 git _a 但我没有找到答案。

感谢任何帮助!

最佳答案

如果您查看 SQS 的文档,您可以看到:

MessageGroupId - This parameter applies only to FIFO (first-in-first-out) queues.

我假设您不小心在 SQS 上创建了 FIFO 队列。所以你需要那个附加参数。您可以像这样修改代码:

var QUEUE_URL = 'https://us-west-2.queue.amazonaws.com/123456789/ntech-event-processing-dev.fifo';
var AWS = require('aws-sdk');
var sqs = new AWS.SQS({region : 'us-west-2'});

exports.handler = function(event, context) {
  var params = {
    MessageBody: JSON.stringify(event),
    QueueUrl: QUEUE_URL,
    MessageGroupId: "TestGroup"
  };
  sqs.sendMessage(params, function(err,data){
    if(err) {
      console.log('error:',"Fail Send Message" + err);
      context.done('error', "ERROR Put SQS");  // ERROR with message
    }else{
      console.log('data:',data.MessageId);
      context.done(null,'');  // SUCCESS 
    }
  });
}

如果您没有从事件中获取 MessageGroupId,那么将 MessageGroupId 放入事件中也没有任何帮助。如果您想从事件接收 MessageGroupId 可能如下所示:

var QUEUE_URL = 'https://us-west-2.queue.amazonaws.com/123456789/ntech-event-processing-dev.fifo';
var AWS = require('aws-sdk');
var sqs = new AWS.SQS({region : 'us-west-2'});

exports.handler = function(event, context) {
  var params = {
    MessageBody: JSON.stringify(event),
    QueueUrl: QUEUE_URL,
    MessageGroupId: event.MessageGroupId
  };
  sqs.sendMessage(params, function(err,data){
    if(err) {
      console.log('error:',"Fail Send Message" + err);
      context.done('error', "ERROR Put SQS");  // ERROR with message
    }else{
      console.log('data:',data.MessageId);
      context.done(null,'');  // SUCCESS 
    }
  });
}

我发现有用的教程是这个 one

关于javascript - 通过lambda函数向SQS发送消息时如何插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61256726/

相关文章:

node.js - Gulp/Node - SASS 编译错误

c# - Lambda 属性值选择器作为参数

java - 我希望这段代码使用 Stream、Lambda 表达式、双冒号运算符在 Java8 中编写

javascript - 具有相同类的 anchor 标记在 jquery 中单击按钮时不返回值

javascript - 从 JSON 对象获取数据时出现问题

javascript - 如何在javascript中包含液体?

c# - LINQ GroupBy 抛出错误

javascript - 终于得到了可折叠的样式以应用于 XML 生成的数据,但数据图标不适用

javascript - 使用javascript连接到另一个网络中的node.js socket.io服务器

node.js - TransferHttpCacheModule 不会阻止 Angular 8 中的重复 HTTP 调用