2015-08-08 7 views
6

Ich habe eine Tabelle 'user_info' in dynamoDB mit einem primären Hash-Schlüssel 'user_id' (String), ohne Bereichsschlüssel, erstellt. Dann habe ich 2 aws Lambda-Funktion erstellt, um die Elemente einzufügen und abzufragen. Ich kann Elemente in die Tabelle einfügen, aber wenn ich die Tabelle abfrage, wird eine ValidationException zurückgegeben: Das angegebene Schlüsselelement stimmt nicht mit dem Schema überein. Meine Anfrage Funktion:ValidationException: Das angegebene Schlüsselelement stimmt nicht mit dem Schema überein

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.'); 
    } 
}); 

Ich erhalte diese Ausnahme:

ValidationException: The provided key element does not match the schema 

Seit 1) Ich habe nur einen Hash-Primärschlüssel. 2) user_id ist als String definiert. Ich weiß wirklich nicht, warum es einen Mismatch-Fehler gibt.

Antwort

15

Endlich fand ich die Antwort. Es geht nicht um das Format von Params, sondern um den Code davor, den ich in meiner Frage nicht gepostet habe. Als ich

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

mit

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

verschwindet die Ausnahme.

+1

Danke .Das hilft mir .. :) –

+0

Brilliant! Dank einer Million scheinen einige Dinge so offensichtlich zu sein, wenn du sie hier gelesen hast. – EranSch

19

Um weiter zu klären, warum das passiert, haben Sie ursprünglich die DynamoDB Document Client verwendet, die es überflüssig macht, Ihre Attribute explizit als "String" (S) oder "Number" (N) usw. zu kennzeichnen. Daher Ihr ursprünglicher Code gearbeitet haben, würden mit

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

var params = { 
Key: { 
    user_id: "[email protected]" 
}, 
TableName: 'user_info', 
ProjectionExpression: 'password' 
}; 

Beachten Sie die „S“ den Wert von „user_id“ Umwickeln wird aus dem obigen Code entfernt. Später wechselten Sie mit 'aws-sdk' wieder zum Low-Level Javascript sdk, so dass Ihr Code mit dem Label "S" funktionierte.

+0

Vielen Dank! Ich hasste immer die DynamoDb-Typen und war mir des Document Client nicht bewusst (der jetzt Teil des offiziellen SDK ist). Deine Antwort hat mir viel Kummer erspart! – Julian