Что может привести к тому, что сканирование таблицы DynamoDB не вернет никаких данных и, тем не менее, никаких ошибок? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть две маленькие таблицы DynamoDB, одна из которых содержит 41 элемент с 6 атрибутами в каждой, а другая - 40 элементов с 2 атрибутами в каждой. Обе таблицы индексируются первичным и вторичным ключами сортировки.

Сканирование большего, FHCClassSchedule , возвращает правильное содержимое всей таблицы. Сканирование меньшего размера FHCRoomCounts не возвращает данных и также без ошибок. В документации DynamoDB говорится, что если сканирование не возвращает данных, оно выдаст ошибку. Но это (похоже) не то, что происходит.

Я видел вопрос Сканирование таблицы DynamoDB не возвращает данные , но его ситуация существенно отличалась от моей. Его стол был большим и неиндексированным. Он делал только один запрос на сканирование, когда требовалось несколько запросов, поскольку таблица превысила ограничение в 1 МБ на запрос. Это не ситуация со мной.

Соответствующий код:

var dynamodb = new AWS.DynamoDB();
var err;
var data;
var counts;
var paramsClassSchedule = {
                           TableName: 'FHCClassSchedule'
                          };
var paramsRoomCounts = {
                          TableName: 'FHCRoomCounts'
                       };
dynamodb.scan(paramsRoomCounts, function( err, counts ) {
  if( err ) {console.log('error @ .scan paramsRoomCounts, err == ', err);}

});
dynamodb.scan( paramsClassSchedule, function( err, data){
    if (err) { console.log('error @ .scan paramsClassSchedule, err == ', err); }
        else {
               console.log('(data, counts) : (', data, counts, ')');
               // other code processing counts & data
             }

console.log показывает, data - это объект с правильным содержимым. Но counts остается undefined, но ошибки не возвращается. Это как если бы запрос на сканирование не был выполнен.

Я проверил все различные настройки (Обзор, Элементы, Метрики, Сигналы тревоги ...) для каждой таблицы, и они одинаковы. Я ничего не вижу в этих настройках относительно таблицы FHCRoomCounts , чтобы отличить ее от таблицы FHCClassSchedule .

Итак, я в растерянности.

Edit: Я бы дал вам фрагмент, но чтобы подключить его к сервисам Amazon Web Services, мне нужно было бы поместить в него мой ключ доступа и «секретный» ключ доступа. Поскольку с ними можно было бы получить беспрепятственный доступ к моей учетной записи, я не склонен это делать. Я бы использовал Amazon Cognito, но я еще не освоил его.

Обновление Это был важный урок для меня в различных сферах.

Переменные counts и data «существуют» в пределах функций анонимного обратного вызова динамодина .scan. Функциональная область. Я получал к ним доступ вне области видимости, и поэтому они были undefined.

Мне нужно было поместить JavaScript, который обращается к ним и обрабатывает их, в вложенных сканированиях. Ответ заключается в том, чтобы вложить два скана один в функцию обратного вызова другого, а затем вложить js, который обрабатывает переменные, возвращаемые обратными вызовами, во внутреннем вложенном сканировании.

Правильный код:

function init() {

  dynamodb.scan(paramsRoomCounts, function( err, counts ) {
   if( err ) {console.log('error @ .scan paramsRoomCounts, err == ',    err);}

    dynamodb.scan( paramsClassSchedule, function( err, data){
      if (err) { console.log('error @ .scan paramsClassSchedule, err == ', err); }
      else {
             console.log('(data, counts) : (', data, counts, ')');
             // further js processing the data and counts variables

           }
    });  // end def callback & scan of paramsClassSchedule
  });  //  end def callback & scan of paramsRoomCounts
}  // end def function init()

Теперь console.log внутри вложенного блока else будет регистрировать правильное содержимое data и counts. Оставшийся код внутри блока else будет работать как положено.

Большое спасибо отличным сотрудникам службы поддержки клиентов в AWS за их преданность делу, помогающую мне усвоить этот урок.

...