Чтение и сохранение данных из DynamoDB в переменной в AWS Lambda - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь считать данные из моей таблицы DynamoDB. Я не просто хочу записывать данные на консоль, но использую эти данные для выполнения другой функции. Мой код сейчас выглядит следующим образом:

  var params = {
    TableName: "eventsList",
    Limit: 100
  };

  docClient.scan(params, onScan);
  var count = 0;

  function onScan(err, data) {
    if (err) {
      console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2));

    } else {        
      console.log("Scan succeeded.");
      data.Items.forEach(function(itemdata) {
        console.log("Item :", ++count,JSON.stringify(itemdata));
        tester[itemdata.name] = itemdata.date;

      });
      // continue scanning if we have more items
      if (typeof data.LastEvaluatedKey != "undefined") {
        console.log("Scanning for more...");
        params.ExclusiveStartKey = data.LastEvaluatedKey;
        docClient.scan(params, onScan);
      }
    }
    return tester;
  }
  console.log(tester);

Вывод, который я получаю, следующий:

Function Logs:
START RequestId: d1e2770c-24ef-4ee6-8570-c5f8bb4ee942 Version: $LATEST
2020-02-12T11:29:30.961Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    GetEventToday handler called
2020-02-12T11:29:31.601Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    {}
2020-02-12T11:29:31.821Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    Scan succeeded.
2020-02-12T11:29:31.821Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    Item : 1 {"name":"firstTestEvent","date":"03/1/2020"}
2020-02-12T11:29:31.821Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    Item : 2 {"name":"anotherTestEvent","date":"04/3/2020"}
2020-02-12T11:29:31.821Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    Item : 3 {"name":"newtestevent","date":"04/4/2020"}
2020-02-12T11:29:31.821Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    Item : 4 {"name":"secondTestEvent","date":"02/9/2020"}
2020-02-12T11:29:31.821Z    d1e2770c-24ef-4ee6-8570-c5f8bb4ee942    INFO    Item : 5 {"name":"thirdTestEvent","date":"03/5/2020"}
END RequestId: d1e2770c-24ef-4ee6-8570-c5f8bb4ee942

Таким образом, как показано, журнал тестера пуст (INFO {}). Так что это означает, что тестер пуст, и я не могу использовать данные, которые, как я думал, я там хранил Если я помещу журнал в скобки до return tester, он заработает и регистрирует сохраненные данные.

Так что мне нужно изменить, чтобы сохраненные данные в тестере возвращались наружу? 1011 * onScan

1 Ответ

0 голосов
/ 12 февраля 2020

Проблема в вашем коде состоит в том, что функция Lambda возвращает результат (пустой объект тестера) до фактического завершения сканирования (следовательно, tester пусто). Это связано с тем, что код не обрабатывает асинхронно JavaScript правильно.

Вот пример того, как ваша функция Lambda может многократно сканировать таблицу, накапливать все элементы и, наконец, возвращать эти накопленные результаты.

const AWS = require('aws-sdk');

const dc = new AWS.DynamoDB.DocumentClient({'region': 'us-east-1'});

function tableScan(ExclusiveStartKey) {
  const params = {
    TableName: "eventsList",
    Limit: 100,
    ExclusiveStartKey,
  };

  return dc.scan(params).promise();
}

exports.handler = async (_event, _context) => {
  try {
    let itemCount = 0;
    let scanCount = 0;
    const results = [];
    let ExclusiveStartKey;

    // eslint-disable-next-line no-constant-condition
    while (true) {
      const data = await tableScan(ExclusiveStartKey);
      console.log("Data:", data);
      ++scanCount;

      data.Items.forEach(item => {
        console.log("Item :", ++itemCount, JSON.stringify(item));
        results.push(item);
      });

      ExclusiveStartKey = data.LastEvaluatedKey;
      if (!ExclusiveStartKey) break;
    }

    console.log("Success:", results, scanCount, itemCount);
    return results;
  } catch(err) {
    console.log("Error:", err);
    throw err;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...