如何在 AWS SQS 中使用 Node.js 接收消息

9

我正在我的Node.js项目中实现SQS。我的操作是在SQS中发送消息并接收它。 但是当我接收到时,它只是ResponseMetadata对象。

   "ResponseMetadata": {
    "RequestId": "8659872b-10f0-57b6-9d57-d1852aba1a64"
    }

响应中没有消息对象。我该怎么办?我有许多可能性,例如更改参数值等,但没有任何作用。

我的代码

   const AWS = require('aws-sdk');
   AWS.config.update({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, region: 'eu-west-1' })
   const sqs = new AWS.SQS({apiVersion: '2012-11-05'});

   onst queueUrl = "https://eu-west-1.queue.amazonaws.com/******/test-queue";

发送消息
     let params = {
            MessageBody: 'Hello world!',
            MessageAttributes: {
                "Title": {
                    DataType: "String",
                    StringValue: "The Whistler"
                },
                "Author": {
                    DataType: "String",
                    StringValue: "John Grisham"
                },
                "WeeksOn": {
                    DataType: "Number",
                    StringValue: "6"
                }
            },
            QueueUrl: queueUrl,
            DelaySeconds: 0
        };

        sqs.sendMessage(params, function (err, data) {
            if (err) {
                res.send(err);
            } else {
                res.send(data);
            }
        });

响应是

     "ResponseMetadata": {
    "RequestId": "da3af650-2642-5460-86b7-a0fe1f9ced6f"
},
"MD5OfMessageBody": "86fb269d190d2c85f6e0468ceca42a20",
"MD5OfMessageAttributes": "1864106991a54cca8b8c732a1841833a",
"MessageId": "13f228b0-7df1-4a9e-bc2b-48535725955e"

接收消息

       sqs.getQueueUrl('queue-name', function(err, data) {
            if (err) {
                console.log("Error", err);
            } else {
                let params = {
                    AttributeNames: [
                        "SentTimestamp"
                    ],
                    MaxNumberOfMessages: 10,
                    VisibilityTimeout: 20,
                    MessageAttributeNames: ["All"],
                    QueueUrl: data.QueueUrl,
                    WaitTimeSeconds: 0
                };

                sqs.receiveMessage(params, function (err, data) {
                    if (err) {
                        res.send(err);
                    } else {
                        res.send(data);
                    }
                });
            }
        });

有人能帮忙吗?我是否遗漏了什么?谢谢提前。


你可以展示一下从 receiveMessage 得到的响应吗? - Jason Wadsworth
1
"ResponseMetadata": { "RequestId": "8659872b-10f0-57b6-9d57-d1852aba1a64" }这是响应内容。 - Usman Saleem
@UsmanSaleem,我的回答解决了你的问题吗? - Ashish Modi
嗨@UsmanSaleem,我知道这是一个旧问题,今天我也遇到了同样的问题,你是否找到了解决方法? - shayaan
3个回答

3

为了进行长轮询,您需要设置WaitTimeSeconds: 20

sqs.getQueueUrl('queue-name', function (err, data) {
    if (err) {
        console.log("Error", err);
    } else {
        let params = {
            AttributeNames: [
                "SentTimestamp"
            ],
            MaxNumberOfMessages: 10,
            VisibilityTimeout: 20,
            MessageAttributeNames: ["All"],
            QueueUrl: data.QueueUrl,
            WaitTimeSeconds: 20
        };

        sqs.receiveMessage(params, function (err, data) {
            if (err) {
                res.send(err);
            } else {
                res.send(data);
            }
        });
    }
});

2
< p > getQueueUrl 调用不正确。您需要将队列名称包装在类似以下内容的对象中< /p >
sqs.getQueueUrl({"QueueName": "queue name"}, function (err, data) {

此外,值得使用 Promise 版本而不是回调函数。
const data = sqs.getQueueUrl({"QueueName": "queue name"}).promise();

// Similary receiveMessage

有趣的是 getQueueUrl() 调用没有产生 MultipleValidationErrors 错误,其中包括 InvalidParameterType 和 MissingRequiredParameter。 这就是我看到的。 - jarmod
我在请求中仍然只得到了 ResponseMetadata。我尝试过使用 sqs.getQueueUrl() 和从字符串中使用 URL。还有更多的想法吗?这在一周前对我有效,没有任何代码更改。 - hamncheez

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接