1つのプライマリハッシュキー「user_id」(String)を使用してdynamoDBにテーブル「user_info」を作成しました。範囲キーはありません。次に、アイテムを挿入およびクエリする2つのawsラムダ関数を作成しました。テーブルにアイテムを挿入できますが、テーブルをクエリすると、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)ハッシュプライマリキーが1つしかないため。 2)user_idは文字列として定義されます。不一致エラーが発生する理由は本当にわかりません。
これが発生する理由をさらに明確にするために、元々 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();
例外が消えます。