ValidationException:提供的键元素与模式不匹配
我在dynamoDB中使用一个主散列键“user_id”(String)创建了一个表'user_info',没有范围键。然后我创建了2个aws lambda函数来插入和查询这些项目。我可以将项插入表中,但是当我查询表时,它会返回一个ValidationException:提供的键元素与模式不匹配。我的查询功能:ValidationException:提供的键元素与模式不匹配
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。我真的不知道为什么有一个不匹配的错误。
最后,我找到了答案。这不是关于params的格式,而是它之前的代码,我没有在我的问题中发布。当我更换
var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();
与
var doc = require('aws-sdk');
var dynamodb = new doc.DynamoDB();
异常消失。
为了进一步阐明为什么会发生这种情况,您最初使用的是DynamoDB Document Client,它不需要将属性明确标记为“字符串”(S)或“数字”(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”标签的代码最终可以正常工作。
非常感谢!我一直很讨厌DynamoDb的类型和不知道的文件客户端(也就是现在的官方SDK的一部分)。你的回答让我非常痛心! – Julian
谢谢。这可以帮助我.. :) –
辉煌!万分感谢,一旦你在这里阅读,有些事情显得非常明显。 – EranSch