ValidationException:提供的key元素与架构不匹配

Raf*_*afy 11 amazon-web-services amazon-dynamodb aws-lambda

我在dynamoDB中创建了一个表'user_info',其中包含一个主哈希键'user_id'(String),没有范围键.然后我创建了2个aws lambda函数来插入和查询项目.我可以在表中插入项目,但是当我查询表时,它返回ValidationException:提供的key元素与模式不匹配.我的查询功能:

var params = {
   Key: {
       user_id:{
           S: "usr1@s.com"
       }
   },
    TableName: 'user_info',
    ProjectionExpression: 'password'
};

dynamodb.getItem(params,
 function(err, data) {
    if (err) {
        console.log("get item err." + err);
        context.done('error','getting item from dynamodb failed: '+err);
    }
    else {
        console.log('great success: '+JSON.stringify(data, null, '  '));
        context.succeed('created user ' + event.user_id + ' successfully.');
    }
});
Run Code Online (Sandbox Code Playgroud)

我一直得到这个例外:

ValidationException: The provided key element does not match the schema
Run Code Online (Sandbox Code Playgroud)

从1)我只有一个哈希主键.2)user_id被定义为String.我真的不知道为什么会出现不匹配错误.

小智 33

为了进一步澄清为什么会发生这种情况,您最初使用的是DynamoDB文档客户端,它无需将您的属性明确标记为"字符串"(S)或"数字"(N)等.因此,您的原始代码将具有与...合作

var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();

var params = {
Key: {
   user_id: "usr1@s.com"
},
TableName: 'user_info',
ProjectionExpression: 'password'
};
Run Code Online (Sandbox Code Playgroud)

请注意,从上面的代码中删除了包装"user_id"值的"S".稍后,您使用'aws-sdk'切换回低级javascript sdk,因此带有"S"标签的代码最终正常工作.

  • 非常感谢!我总是讨厌DynamoDb的类型,并且不知道Document Client(现在是官方SDK的一部分).你的回答让我感到很悲伤! (2认同)

Raf*_*afy 16

最后,我找到了答案.它不是关于params的格式,而是关于它之前的代码,我没有在我的问题中发布.当我更换

var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();
Run Code Online (Sandbox Code Playgroud)

var doc = require('aws-sdk');
var dynamodb = new doc.DynamoDB();
Run Code Online (Sandbox Code Playgroud)

异常消失了.


Fos*_*tah 7

(与OP不同的场景)

当我的表同时具有哈希键和排序键时,当我尝试仅通过哈希键进行查询时,也发生了同样的错误。我删除了未使用的SORT键,因为我不需要它,它解决了我的问题。