У меня есть две маленькие таблицы 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 за их преданность делу, помогающую мне усвоить этот урок.