web-dev-qa-db-ja.com

ValidationException:指定されたキー要素がスキーマと一致しません

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は文字列として定義されます。不一致エラーが発生する理由は本当にわかりません。

11
Rafy

これが発生する理由をさらに明確にするために、元々 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」ラベルの付いたコードが機能しました。

33
Daniela Miao

ついに、答えを見つけました。これはparamsの形式ではなく、その前のコードであり、質問には投稿していません。交換するとき

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

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

例外が消えます。

16
Rafy