2015-08-08 41 views
6

我在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。我真的不知道爲什麼有一個不匹配的錯誤。

回答

15

最後,我找到了答案。這不是關於params的格式,而是它之前的代碼,我沒有在我的問題中發佈。當我更換

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

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

異常消失。

+1

謝謝。這可以幫助我.. :) –

+0

輝煌!萬分感謝,一旦你在這裏閱讀,有些事情顯得非常明顯。 – EranSch

19

爲了進一步闡明爲什麼會發生這種情況,您最初使用的是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

相關問題