Amazon web services Amazon Web服务:DynamoDB:updateItem提供验证错误

Amazon web services Amazon Web服务:DynamoDB:updateItem提供验证错误,amazon-web-services,amazon-dynamodb,Amazon Web Services,Amazon Dynamodb,问题: 我正在努力解决AWS的dynamoDB中的updateItem指令。据我所知,我完全按照文档中的说明和Amazon支持技术人员的指导编写了代码。尽管如此,我还是收到了一条包含13个验证错误的错误消息。它们对我来说毫无意义 到目前为止我所做的: 我搜索了StackOverflow并阅读了AWS DynamoDB的几个问题。没有一个是正确的。我在网上搜索了一下,没有找到任何帮助。我一直在读AWS DynamoDB参考资料,但它很密集,而且进展缓慢。我还在努力 我建造了这个密码笔 任何帮助都将

问题:

我正在努力解决AWS的dynamoDB中的
updateItem
指令。据我所知,我完全按照文档中的说明和Amazon支持技术人员的指导编写了代码。尽管如此,我还是收到了一条包含13个验证错误的错误消息。它们对我来说毫无意义

到目前为止我所做的:

我搜索了StackOverflow并阅读了AWS DynamoDB的几个问题。没有一个是正确的。我在网上搜索了一下,没有找到任何帮助。我一直在读AWS DynamoDB参考资料,但它很密集,而且进展缓慢。我还在努力

我建造了这个密码笔

任何帮助都将不胜感激

JavaScript代码

    var dynamoDB = new AWS.DynamoDB();
    params0 = {
               'TableName': 'FHCRoomCounts',
               'Key': {
                          timeSlot: '0830',
                        room: 'chapel',
                      },
                'UpdateExpression': 'ADD registrants :n',
               'ExpressionAttributeValues': {
                                              ':n' : 1,
                                            },
               'ReturnValues': 'ALL_NEW' 
           };

          console.log('log params0 : ');
          for(let [key, value] of Object.entries(params0)) {
            console.log(key, value);
          } // end for-let
          console.log('calling dynamoDB.updateItem');

    dynamoDB.updateItem(params0, function(err, data) {
      if (err) {
              console.log('Unable to update registrant: ' + '\n' + JSON.stringify(err, undefined, 2));
  } else {
              console.log('Increase registrant succeeded: ' + '\n' + JSON.stringify(data, undefined, 2));
          }  // end else
错误消息:13个验证错误。

下面是控制台日志。我记录了params对象,以便您可以查看提交给AWS的内容

    jquery loaded 
    AWS sdk loaded
    log params0 : 
    TableName FHCRoomCounts
    Key Object { timeSlot: "0830", room: "chapel" }
    UpdateExpression ADD registrants :n 
    ExpressionAttributeValues Object { ":n": 1 }
    ReturnValues ALL_NEW 
    calling dynamoDB.updateItem 
    Unable to update registrant: 
    {
       "message": "There were 13 validation errors:\n*     

    InvalidParameterType: Expected params.Key['timeSlot'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Key['timeSlot']\n* UnexpectedParameter: Unexpected key '1' found in params.Key['timeSlot']\n* UnexpectedParameter: Unexpected key '2' found in params.Key['timeSlot']\n* UnexpectedParameter: Unexpected key '3' found in params.Key['timeSlot']\n* InvalidParameterType: Expected params.Key['room'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Key['room']\n* UnexpectedParameter: Unexpected key '1' found in params.Key['room']\n* UnexpectedParameter: Unexpected key '2' found in params.Key['room']\n* UnexpectedParameter: Unexpected key '3' found in params.Key['room']\n* UnexpectedParameter: Unexpected key '4' found in params.Key['room']\n* UnexpectedParameter: Unexpected key '5' found in params.Key['room']\n* InvalidParameterType: Expected params.ExpressionAttributeValues[':n'] to be a structure",
  "code": "MultipleValidationErrors",
  "errors": [
    {
      "message": "Expected params.Key['timeSlot'] to be a structure",
      "code": "InvalidParameterType",
      "time": "2019-06-15T04:51:05.288Z"
    },
    {
      "message": "Unexpected key '0' found in params.Key['timeSlot']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.289Z"
    },
    {
      "message": "Unexpected key '1' found in params.Key['timeSlot']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.289Z"
    },
    {
      "message": "Unexpected key '2' found in params.Key['timeSlot']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.289Z"
    },
    {
      "message": "Unexpected key '3' found in params.Key['timeSlot']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.289Z"
    },
    {
      "message": "Expected params.Key['room'] to be a structure",
      "code": "InvalidParameterType",
      "time": "2019-06-15T04:51:05.290Z"
    },
    {
      "message": "Unexpected key '0' found in params.Key['room']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.290Z"
    },
    {
      "message": "Unexpected key '1' found in params.Key['room']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.290Z"
    },
    {
      "message": "Unexpected key '2' found in params.Key['room']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.290Z"
    },
    {
      "message": "Unexpected key '3' found in params.Key['room']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.290Z"
    },
    {
      "message": "Unexpected key '4' found in params.Key['room']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.290Z"
    },
    {
      "message": "Unexpected key '5' found in params.Key['room']",
      "code": "UnexpectedParameter",
      "time": "2019-06-15T04:51:05.290Z"
    },
    {
      "message": "Expected params.ExpressionAttributeValues[':n'] to be a structure",
      "code": "InvalidParameterType",
      "time": "2019-06-15T04:51:05.291Z"
    }
  ],
  "time": "2019-06-15T04:51:05.291Z",
  "stack": "validate@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:61:19246\n[311]</a.EventListeners.Core</<@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:60:25947\ncallListeners@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:26769\ns@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:26635\n[311]</a.EventListeners.Core</</<@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:60:25280\nt@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:59:25669\ngetCredentials/</<@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:59:25990\nget@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:59:30534\ngetCredentials/<@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:59:25896\ngetCredentials@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:59:25997\n[311]</a.EventListeners.Core</<@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:60:25149\ncallListeners@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:26740\nemit@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:26480\nemitEvent@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:12277\ne@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:7919\n[363]</i.prototype.runTo@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:64:9533\nrunTo@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:9575\nsend@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:9468\nmakeRequest@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:62:30482\ndefineMethods/</e.prototype[t]@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:63:5136\nupdateTable@https://steve-alexander-pfmi.squarespace.com/test-register-2019:110:12\n"
} 
jquery已加载
已加载AWS sdk
日志参数0:
表名FHCRoomCounts
关键对象{时隙:“0830”,房间:“礼拜堂”}
UpdateExpression添加注册者:n
ExpressionAttributeValues对象{:n“:1}
返回所有新的值
调用dynamoDB.updateItem
无法更新注册人:
{
“消息”:“有13个验证错误:\n*
InvalidParameterType:应为params。键['timeSlot']为结构\n*未预期参数:在params中找到意外键“0”。键['timeSlot']\n*未预期参数:在params中找到意外键“1”。键['timeSlot']\n*未预期参数:在params中找到意外键“2”。键['timeSlot']\n*意外参数:在参数中找到意外键“3”。键['timeSlot']\n*InvalidParameterType:预期的参数。键['room']应为结构\n*意外参数:在参数中找到意外键“0”。键['room']\n*意外参数:在参数中找到意外键“1”。键['room']\n*意外参数:在参数中找到意外键“2”。键['room']\n*意外参数:在参数中找到意外键“3”。键['room']\n*意外参数:在参数中找到意外键“4”。键['room']\n*意外参数:在参数中找到意外键“5”。键['room']\n*InvalidParameterType:预期params.ExpressionAttributeValues[':n']为结构“,
“代码”:“MultipleValidationErrors”,
“错误”:[
{
“消息”:“预期params.Key['timeSlot']为结构”,
“代码”:“InvalidParameterType”,
“时间”:“2019-06-15T04:51:05.288Z”
},
{
“消息”:“在params.key['timeSlot']中找到意外的键“0”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.289Z”
},
{
“消息”:“在params.key['timeSlot']中找到意外的键'1'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.289Z”
},
{
“消息”:“在params.key['timeSlot']中找到意外的键'2'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.289Z”
},
{
“消息”:“在params.key['timeSlot']中找到意外的键'3'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.289Z”
},
{
“消息”:“预期params.Key['room']为结构”,
“代码”:“InvalidParameterType”,
“时间”:“2019-06-15T04:51:05.290Z”
},
{
“消息”:“在params.key['room']中找到意外的键“0”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.290Z”
},
{
“消息”:“在params.key['room']中找到意外的键'1'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.290Z”
},
{
“消息”:“在params.key['room']中找到意外的键'2'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.290Z”
},
{
“消息”:“在params.key['room']中找到意外的键'3'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.290Z”
},
{
“消息”:“在params.key['room']中找到意外的键'4'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.290Z”
},
{
“消息”:“在params.key['room']中找到意外的键'5'”,
“代码”:“意外参数”,
“时间”:“2019-06-15T04:51:05.290Z”
},
{
“消息”:“预期params.ExpressionAttributeValues[':n']为结构”,
“代码”:“InvalidParameterType”,
“时间”:“2019-06-15T04:51:05.291Z”
}
],
“时间”:“2019-06-15T04:51:05.291Z”,

“堆栈”:validate@https://sdk.amazonaws.com/js/aws-sdk-2.470.0.min.js:61:19246\n[311]好的,在深入了解aws DynamoDB文档大约十年后,我找到了指定var params0的正确方法。我将在这里发布它,以防有人对未来感兴趣

params0 = {
           'TableName': 'FHCRoomCounts',
           'Key': {
                   'timeSlot': {
                                'S': '0830'
                               },
                    'room': {
                              'S': 'chapel'

                            }
                 },
          'ExpressionAttributeValues': {
                                          ':n': {'N': '1'},
                                       },
          'UpdateExpression':'ADD registrants :n',
          'ReturnValues': 'ALL_NEW', 

          };

回答晚了,DynamoDB很棘手,因为一旦设置了数据类型,您就必须确保在插入和更新等过程中始终以相同的方式对其进行解释。有时,DynamoDBMarshaller可以很好地完成这项工作,其他时候,您只需自己为其提供正确的类型,就像使用javascript一样

还需要注意的是,只有在使用可能与dynamodb保留字冲突的键名时,才需要ExpressionAttributeValues。“COUNTER”是保留字

    TableName: 'MyTable',
    Key: {
        id: { S: '100001' }, // its forced as a string type by the 'S'
    },
    UpdateExpression: 'set counter=:c', // can be directly set if its not a reserved word
    ConditionExpression: 'attribute_exists(id)', // conditional only update if exists
    ExpressionAttributeValues: {
        // all below are reserved word safe
        ':c': { N: '500' }, // its forced as a number
        //':c': '500', // its not forced to a type, so it will try a string type
    },
类型有N、S、BOOL、B、SS,例如日期是“S”类型

有用链接:


我感谢所有花时间阅读问题的人,包括两位投反对票的人。如果他们能解释投反对票的原因,这将有助于我更好地制定未来的问题。我想阅读所有的意见,甚至是反对意见。这是一个人学习的方式。我想对你的问题投我的一票。@alxfyv非常感谢,@jan提供了这么一条宝贵的信息。您的解释真的帮了我很大的忙,非常感谢!:)