DynamoDb扫描返回本地所有数据,但不返回实时数据

时间:2019-04-18 15:06:27

标签: node.js aws-lambda amazon-dynamodb aws-api-gateway serverless

我使用此递归调用从dynamodb获取超过1 mb的数据

params.ConsistentRead = true;
  let projectCollection = [];
  dynamoDb.scan(params, onQuery);
  function onQuery(err, data) {
      const methodName = 'onQuery';
      if (err) {
          callback(err);
      } else {
          for (let i = 0; i < data.Items.length; i++) {
              projectCollection.push(data.Items[i]);
          }
          if (typeof data.LastEvaluatedKey !== 'undefined') {
              params.ExclusiveStartKey = data.LastEvaluatedKey;
              dynamoDb.scan(params, onQuery);

          } else {        
              callback(err, projectCollection); //recursive call
          }
      }
  }
};

但是我在本地主机上获取了数据,但是一旦我将其部署在aws上, 调用先通过管道API GATEWAY,然后依次通过lambda和dynamodb,我的函数不会返回所有数据,而是返回一小块。

是缓存问题吗?

2 个答案:

答案 0 :(得分:0)

可能,但是我认为您很有可能没有按预期分页扫描结果。我认为最可能的解释是您仅在阅读第一页。

我不是nodejs使用者,但我注意到您使用的是严格的操作数:

typeof data.LastEvaluatedKey !== 'undefined'

您似乎正在对字符串进行测试,我认为该字符串将始终返回true。公平地说,我不认为这是您的根本问题,但是您应该使用..?

typeof data.LastEvaluatedKey != 'undefined'

答案 1 :(得分:0)

我改用QUERY,并根据需要更快地提供数据。

let items = [];
  let queryExecute = function(callback) {
      dynamoDb.query(params,function(err,result) {
          if(err) {
              callback(err);
              } else {
              items = items.concat(result.Items);
              if(result.LastEvaluatedKey) {
                  params.ExclusiveStartKey = result.LastEvaluatedKey;
                  queryExecute(callback);
                  } else {         
                      callback(err,items);
                  }
              }
          });
      };