AWS DynamoDB анализирует возвращенные данные - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь использовать JS для запроса DynamoDB и анализа возвращаемых данных.Я должен признать, что я новичок в JavaScript, но у меня странное поведение.

В следующей функции я передаю массив дат и извлекаю объекты из моей таблицы

var queryDynamo = function(dateArray){
  console.log(dateArray)
  for (var i = 0; i < dateArray.length; i++) {
    var params = {
        TableName : "myTable",
        KeyConditionExpression: "#day = :st ",
        ExpressionAttributeNames:{
            "#day": "day"
        },
        ExpressionAttributeValues: {
            ':st': dateArray[i]
        }
    };
    var resp = docClient.query(params, function(err, data) {
        if (err) {
                console.log("ERR:"+JSON.stringify(err, undefined, 2))
            } else {
                data.Items.forEach(function(element) {
                    console.log(element)
                });        
            }
        });
      }
      console.log(resp.response)
      return;
    }

-> Следующее является выводом

constructor {request: constructor, data: null, error: null, retryCount: 0, redirectCount: 0, …}
        data:
          Count: 4
          Items: (4) [{…}, {…}, {…}, {…}]
          ScannedCount: 4
          __proto__: Object
          error: null
        httpResponse: constructor {statusCode: 200, headers: {…}, body: Uint8Array(1134), streaming: false, stream: i, …}
        maxRedirects: 10
        maxRetries: 10
        nextPage: ƒ (e)
        redirectCount: 0
        request: constructor {domain: undefined, service: t.c…r.t.constructor, operation: "query", params: {…}, httpRequest: constructor, …}
        retryCount: 0
        __proto__: Object

Запрос успешно выполнен, но результат довольно странный.

  • соответственно ответ правильно содержит dataобъект, но я не могу получить к нему доступ.Он говорит, что это null, хотя его явно нет, поскольку у него 4 предмета.

    Есть мысли?

1 Ответ

0 голосов
/ 13 ноября 2018

Вы пытаетесь распечатать данные ответа до того, как они существуют. Ваша строка console.log(resp.response) выполняется до того, как запрос DynamoDB будет завершен, и его результаты будут разбиты. Это общая ошибка в асинхронном JavaScript.

Один из способов увидеть данные ответа в объекте AWS.Request - это подождать их, например, (хотя вы никогда бы не сделали это в JavaScript):

var req = docClient.query(params, function(err, data) {
  // as before: handle err, data
)};

setTimeout(function () {
  console.log('Response data:', JSON.stringify(req.response.data));
}, 2000);

Более распространенный шаблон - использовать варианты обещаний методов SDK, например:

docClient.query(params).promise()
  .then(data => doSomething(data))
  .catch(err => logError(err));
...