AWS Lambda заканчивается рано (без явного возврата или обратного вызова) - PullRequest
0 голосов
/ 28 мая 2018

У меня возникла небольшая проблема с каким-то кодом node.js, который я помещаю в AWS Lambda.У меня есть пара асинхронных вызовов, которые мне нужно сделать, и в то время как первый ведет себя так, как я ожидал, лямбда-функция завершается до завершения второго вызова.

Возврат равен нулю, что делаетя думаю, что лямбда выполняет свой неявный обратный вызов, но я не думаю, что это следует делать, пока есть обещание, которое еще не выполнено.

Код:

exports.handle = async function(event, context) {
  var AWS = require("aws-sdk");

  AWS.config.update({
    region: "eu-west-1",
    endpoint: "dynamodb.eu-west-1.amazonaws.com"
  });

  var docClient = new AWS.DynamoDB.DocumentClient();
  console.log("Scanning Catalogue...");

  var params = {
    TableName : "Catalogue"
  };

  await docClient.scan(params).promise().then(function (data) {
    console.log("Scan succeeded.");
    data.Items.forEach(function (item) {
      //console.log(item.url);
      checkIfUpdateRequired(item);
    })
  })
}

async function checkIfUpdateRequired (catalogueItem) {
  var request = require("request-promise");
  console.log("Getting " + catalogueItem.url);

  await request(catalogueItem.url).then(function(response) {
    console.log(response.statusCode);
    console.log(response.headers['content-type']);
  });

}

Выходные данные журнала:

START RequestId: 634a55b7-6258-11e8-9f18-6b300c3b5de1 Version: $LATEST
2018-05-28T09:20:44.425Z    634a55b7-6258-11e8-9f18-6b300c3b5de1    Scanning Catalogue...
2018-05-28T09:20:45.446Z    634a55b7-6258-11e8-9f18-6b300c3b5de1    Scan succeeded.
2018-05-28T09:20:47.967Z    634a55b7-6258-11e8-9f18-6b300c3b5de1    Getting https://raw.githubusercontent.com/BSData/wh40k/master/Aeldari%20-%20Craftworlds.cat
2018-05-28T09:20:48.028Z    634a55b7-6258-11e8-9f18-6b300c3b5de1    Getting https://raw.githubusercontent.com/BSData/wh40k/master/Imperium%20-%20Adeptus%20Custodes.cat
END RequestId: 634a55b7-6258-11e8-9f18-6b300c3b5de1
REPORT RequestId: 634a55b7-6258-11e8-9f18-6b300c3b5de1  Duration: 7882.68 ms    Billed Duration: 7900 ms    Memory Size: 128 MB Max Memory Used: 49 MB

Таким образом, журнал сообщает мне, что вызывается checkIfUpdateRequired (), но лямбда заканчивается (сообщает об успешном завершении с нулевым значением результата) до того, как обещание выполнено.Я не делаю никаких ручных возвратов или обратных вызовов обработчику, которые кажутся нормой для проблем, связанных с окончанием лямбды «рано».

Я в своем уме, может кто-нибудь предложить какие-либо предложения?

1 Ответ

0 голосов
/ 28 мая 2018

Вы не ожидаете завершения обещания checkIfUpdateRequired;все в docClient.scan синхронно в вашем исходном коде.Используйте Promise.all, чтобы дождаться выполнения всех обещаний:

await docClient.scan(params).promise().then(function (data) {
  console.log("Scan succeeded.");
  return Promise.all(data.Items.map(checkIfUpdateRequired));
});

Обратите внимание, что если вы используете await, ваш код будет более простым и понятным, если вы обычно его используете вместо .then.Например, вы можете изменить рефакторинг на:

const data = await docClient.scan(params).promise();
return Promise.all(data.Items.map(checkIfUpdateRequired));

и

async function checkIfUpdateRequired (catalogueItem) {
  // actually, better to only require once, rather than on every function call
  const request = require("request-promise");
  console.log("Getting " + catalogueItem.url);
  const response = await request(catalogueItem.url)
  console.log(response.statusCode);
  console.log(response.headers['content-type']);
}
...