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(); 

异常消失。

+1

谢谢。这可以帮助我.. :) –

+0

辉煌!万分感谢,一旦你在这里阅读,有些事情显得非常明显。 – EranSch

为了进一步阐明为什么会发生这种情况,您最初使用的是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”标签的代码最终可以正常工作。

+0

非常感谢!我一直很讨厌DynamoDb的类型和不知道的文件客户端(也就是现在的官方SDK的一部分)。你的回答让我非常痛心! – Julian