首页 > 解决方案 > 什么可能导致 DynamoDB 表扫描既不返回数据又不返回错误?

问题描述

我有两个小的 DynamoDB 表,一个有 41 个项目,每个项目有 6 个属性,另一个有 40 个项目,每个项目有 2 个属性。两个表都使用主排序键和辅助排序键进行索引。

扫描较大的FHCClassSchedule 会返回正确的整个表内容。对较小的FHCRoomCounts进行扫描,既不返回数据也不返回错误。DynamoDB文档说,如果扫描没有返回数据,它将返回错误。但这(似乎)不是正在发生的事情。

我见过Scan DynamoDB table is not returned 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 Cognito,但我还没有(还)掌握它。

更新 这对我来说是可变范围的重要一课。

变量countsdata“存在”在 dynamodb.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()

现在,嵌套else块内的 console.log 将记录正确的data内容counts。块内的剩余代码else将按预期工作。

非常感谢 AWS 出色的客户支持人员,他们致力于帮助我学习这一课。

标签: javascriptamazon-dynamodbdynamodb-queries

解决方案


推荐阅读