从NodeJS中的AWS SQS获取所有消息

问题描述 投票:1回答:3

我有以下函数从aws SQS获取消息,问题是我一次得到一个,我希望得到所有这些,因为我需要检查每条消息的ID:

function getSQSMessages() {

    const params = {
        QueueUrl: 'some url',
    };

    sqs.receiveMessage(params, (err, data) => {
        if(err) {
            console.log(err, err.stack)
            return(err);
        }
        return data.Messages;
    });

};

function sendMessagesBack() {

    return new Promise((resolve, reject) => {
        if(Array.isArray(getSQSMessages())) {
            resolve(getSQSMessages());
        } else {
            reject(getSQSMessages());
        };
    });

};

sendMessagesBack()函数用于另一个async / await函数。我不知道如何获取所有消息,因为我正在研究如何获取它们,人们提到循环但我无法想象如何在我的情况下实现它。我假设我必须将sqs.receiveMessage()放在一个循环中,但后来我对我需要检查什么以及何时停止循环以使我得到每条消息的ID感到困惑?

如果有人有任何提示,请分享。谢谢。

node.js amazon-web-services amazon-sqs
3个回答
1
投票

您永远无法保证在队列中获取所有消息,除非您获得其中一些消息后将其从队列中删除 - 从而确保下一个请求返回不同的记录选择。

每个请求都会返回“最多”10条消息,如果您不删除它们,那么下一个“upto”10条消息的请求很可能会返回您已经看过的消息和一些新消息 - 所以你永远不会真正知道你何时看到它们。

可能一个队列不是在你的用例中使用的正确工具 - 但由于我不知道你的用例,很难说。


2
投票

我建议你使用Promise api,它会让你立即使用async / await语法。

const { Messages } = await sqs.receiveMessage(params).promise();
// Messages will contain all your needed info
await sqs.sendMessage(params).promise();

这样,您就不需要使用Promises包装回调API。


2
投票

SQS在响应中不返回超过10条消息。要获取所有可用消息,需要递归调用getSQSMessages函数。如果从getSQSMessages返回一个promise,你可以这样做。

getSQSMessages()
.then(data => {
  if(!data.Messages || data.Messages.length === 0){
      // no messages are available. return
  }
  // continue processing for each message or push the messages into array and call 
 //getSQSMessages function again. 
});
© www.soinside.com 2019 - 2024. All rights reserved.