amazon-web-services - 如何在 Node.js 上为 dynamodb getItem 在 JSON 中表达哈希 + 范围

标签 amazon-web-services amazon-dynamodb aws-lambda

我在 dynamodb 中有一个名为 Message 的表。键由哈希(称为数字的entryStamp)和范围(称为字符串的userId)组成。

我正在尝试使用 Node.js Lambda 对其执行 getItem 操作。我知道如何使用仅哈希键为不同的表获取Item,并且它有效。

但是我找不到有关如何修改 json 以表达键的 Range 部分的文档。

var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
exports.handler = function(event, context) {
    var messageIdParts = event.messageId.split("-");
    var desiredStampString = messageIdParts[0];
    var desiredSendStamp = Number(desiredStampString);
    var userId = messageIdParts[1];

    var params = {
        "ConsistentRead": false,
        "Key": {
            HashKeyElement: { "entryStamp": desiredSendStamp },
            RangeKeyElement: { "userId": userId }
           },
        "ProjectionExpression": "message",
        "ReturnConsumedCapacity": "NONE",
        "TableName": "Message"
    }
    try {
        dynamo.getItem(params, context.done);
    } catch (e) {
        console.log("Exception for getItem: " + e);
    }
};

以下是 DynamoDB“详细信息”选项卡中表格的信息:

Table Name: Message
Primary Hash Key:   entryStamp (Number)
Primary Range Key:  userId (String)
Table Status:   Active

这是我传递给 event.messageId 的内容:

{
    "messageId": "1443768744451-testUser"
}

提前致谢! 当我将上述内容发送到 getItem 时,我得到:

{
   "errorMessage": "The provided key element does not match the schema",
   "errorType": "ValidationException",
   "stackTrace": [
        "Request.extractError (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/protocol/json.js:40:27)",
        "Request.callListeners (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/sequential_executor.js:100:18)",
        "Request.emit (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/sequential_executor.js:77:10)",
        "Request.emit (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:604:14)",
        "Request.transition (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:21:12)",
        "AcceptorStateMachine.runTo (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/state_machine.js:14:12)",
        "/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/state_machine.js:26:10",
        "Request.<anonymous> (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:22:9)",
"Request.<anonymous> (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:606:12)",
        "Request.callListeners (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/sequential_executor.js:104:18)"
      ]
    }

最佳答案

我认为params中的Key定义不太正确,您不需要指定HashKeyElementRangeKeyElement。尝试:

var params = {
        "ConsistentRead": false,
        "Key": {
            "entryStamp": desiredSendStamp,
            "userId": userId
           },
        "ProjectionExpression": "message",
        "ReturnConsumedCapacity": "NONE",
        "TableName": "Message"
};

此外,您还可以使用 DocumentClient class如果您升级,现在就在 aws-sdk 包中。

关于amazon-web-services - 如何在 Node.js 上为 dynamodb getItem 在 JSON 中表达哈希 + 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32913544/

相关文章:

amazon-web-services - 无法从 Fargate 连接 AWS Elasticsearch。获取 java.net.UnknownHostException

amazon-web-services - ECS 中的最小任务数和期望的任务数有什么区别?

node.js - 没有这样的说明书——OpsWorks 找不到自定义说明书

amazon-web-services - DynamoDBMapper 有条件保存对象列表

mocha.js - 使用 mocha 使用本地 dynamodb 编写测试

amazon-web-services - Webpack 外部不需要

python - Dynamodb 查询具有多个属性值

java - 如何将新的键值对放入 DynamoDB 中的映射中? ( java )

amazon-web-services - Lambda 每次调用都会创建 ENI : Hitting limit

amazon-web-services - 在本地Docker中运行AWS Lambda