我在dynamoDB中创建了一个表'user_info',其中包含一个主哈希键'user_id'(String),没有范围键。然后我创建了2个aws lambda函数来插入和查询项目。我可以在表中插入项目,但是当我查询表时,它返回ValidationException:提供的key元素与模式不匹配。我的查询功能:
var params = {
Key: {
user_id:{
S: "[email protected]"
}
},
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.');
}
});
我一直得到这个例外:
ValidationException: The provided key element does not match the schema
从1)我只有一个哈希主键。 2)user_id被定义为String。我真的不知道为什么会出现不匹配错误。
为了进一步澄清为什么会发生这种情况,你最初使用的是DynamoDB Document Client,它消除了需要明确地将你的属性标记为“String”(S)或“Number”(N)等。因此,你的原始代码可以使用
var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();
var params = {
Key: {
user_id: "[email protected]"
},
TableName: 'user_info',
ProjectionExpression: 'password'
};
请注意,从上面的代码中删除了包装“user_id”值的“S”。稍后,您使用'aws-sdk'切换回低级javascript sdk,因此带有“S”标签的代码最终正常工作。
最后,我找到了答案。它不是关于params的格式,而是关于它之前的代码,我没有在我的问题中发布。当我更换
var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();
同
var doc = require('aws-sdk');
var dynamodb = new doc.DynamoDB();
异常消失了。