Как заставить эту nodejs лямбда ждать, пока работа не будет выполнена? - PullRequest
0 голосов
/ 17 июня 2020

Я новичок ie в nodejs.

У меня есть лямбда AWS, которая читает очередь и удаляет сообщения после их обработки:

const AWS = require('aws-sdk');
AWS.config.logger = console;
const sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const redriveQueueUrl = 'https://myqueue";

async function deleteMessage (messageToDelete) {
    let params = {
        QueueUrl: redriveQueueUrl,
        ReceiptHandle: messageToDelete.ReceiptHandle
    };
    sqs.deleteMessage(params, function (err, data) {
        if (err) console.log(err, err.stack);
        else console.log(data);
    });
}


exports.handler = async (event) => {

    var params = {
        QueueUrl: redriveQueueUrl,
        MaxNumberOfMessages: '2',

    };
    let sqsResponse = await sqs.receiveMessage(params).promise();
    let messages = sqsResponse.Messages

    for (let index in messages) {
        // do something here later.
        await deleteMessage(messages[index]);
    };

    const response = {
        statusCode: 200,
        body: JSON.stringify('End of Lambda!'),
    };
    return response;
};

Это код правильно читает заданную очередь, но не удаляет сообщения. Как решить эту проблему?

1 Ответ

1 голос
/ 17 июня 2020

sqs.deleteMessage необходимо вернуть обещание. В противном случае вызов await sqs.deleteMessage() вернется немедленно.

Попробуйте следующее:

async function deleteMessage (messageToDelete) {
    let params = {
        QueueUrl: redriveQueueUrl,
        ReceiptHandle: messageToDelete.ReceiptHandle
    };
    return new Promise((resolve, reject)=>{
      sqs.deleteMessage(params, function (err, data) {
          if (err) return reject(err);
          else return resolve(data);
      });
    })
}
...