在 NodeJS 中获取来自 AWS SQS 的所有消息

squ*_*ave 5 amazon-sqs amazon-web-services node.js

我有以下函数从 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());
        };
    });

};
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*aru 7

我建议您使用 Promise api,它将使您可以立即使用 async/await 语法。

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

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


E.J*_*nan 2

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

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

也许队列不是在您的用例中使用的正确工具 - 但由于我不知道您的用例,所以很难说。