1

我们如何通过调用 dynamodb.query 获取所有项目?

文档指出我们需要寻找LastEvaluatedKey. 只是想知道我们如何以有效的方式聚合所有项目

app.get(path, function (req, res) {
  var allItems = [];
  var params = {
    TableName: tableName,
    "IndexName": "status-index",
    "KeyConditionExpression": "#attrib_name = :attrib_value",
    "ExpressionAttributeNames": { "#attrib_name": "status" },
    "ExpressionAttributeValues": { ":attrib_value": req.query.status },
    "ScanIndexForward": false
  };

  dynamodb.query(params, onQuery);

  function onQuery(err, data) {
    if (err) {
      res.json({ error: 'Could not load items: ' + err });
    } else {
      // Should I be aggregating all the items like this?
      allItems = allItems.concat(data.Items);

      // Then should I set it to res like this to return all the items?
      res.json(allItems);

      if (typeof data.LastEvaluatedKey != 'undefined') {
        params.ExclusiveStartKey = data.LastEvaluatedKey;
        dynamodb.query(params, onQuery);
      }
    }
  }
});

请查看代码中的注释。这就是我认为我们需要有适当的代码来聚合所有项目并返回响应的地方。

我还没有找到调试方法,因为我对 DynamoDB 和 AWS Amplify 还很陌生。让我知道是否有更简单的方法可以在 AWS 放大备份的 GET API 中进行调试。

4

2 回答 2

0

查询返回分页结果 - 如果您想要所有数据,那么您需要继续查询和聚合,直到您的LastEvaluatedKey为空。

参考:https ://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

于 2019-07-01T02:45:02.890 回答
0

这不是对您问题的直接回答,而是建议。我写了一篇文章“如何在 Lambda 函数中使用 AWS AppSync”

它的 TLDR 是:

  • 创建一个 Lambda 函数,该函数使用 AppSync 客户端执行 GraphQL 操作。使用 polyfill 并安装所有必要的依赖项。
  • 确保 Lambda 函数具有正确的执行策略。
  • 使用 AppSync 的多重身份验证来允许由 Amazon Cognito 用户池签名的请求以及使用 Amazon 的 IAM 签名的请求。这样,客户端和服务器(又名 Lambda 函数)都将通过身份验证,并且可以拥有不同的 CRUD 权限。

如果我是您并且想通过 Lambda 函数访问我的数据库,我会按照该教程并使用 AppSync 来完成。对您而言重要的优势之一是您不必关心LastEvaluatedKey,您可以使用nextToken更安全的 AppSync。

于 2019-06-30T13:33:20.683 回答