我有两个小的DynamoDB表,一个表具有41个项,每个项具有6个属性,一个具有40个项,每个项具有2个属性。这两个表都使用主排序键和辅助排序键进行索引。
扫描较大的 FHCClassSchedule 会返回正确的整个表内容。扫描较小的 FHCRoomCounts 不会返回任何数据并且也不会出现错误。 DynamoDB documentation说,如果扫描不返回任何数据,它将返回一个错误。但这(似乎)不是正在发生的事情。
我已经看到了问题Scan DynamoDB table is not returning data,但他的情况与我的情况有很大不同。他的桌子很大,没有索引。当需要多个请求时,他只发出一个扫描请求,因为该表超出了每个请求1MB的限制。这不是我的情况。
相关代码为:
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 表区分开。
所以,我很茫然。
编辑: 我会给您一个代码段,但是要使其连接到Amazon Web Services,我必须在代码段中放入访问密钥和“秘密”访问密钥。既然有了他们,人们就可以不受限制地访问我的帐户,因此我不愿意这样做。我会使用Amazon Cognito,但尚未掌握它。
更新 这是我在可变范围内的重要一课。
在dynamodb.scan匿名回调函数的范围内,变量counts
和data
“存在”。属于功能范围。我在范围之外访问它们,因此它们是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()
现在,嵌套else
块中的console.log将记录正确的data
和counts
内容。 else
块中的其余代码将按预期工作。
非常感谢AWS出色的客户支持人员竭诚帮助我学习本课程。