На прошлой неделе я играл с AWS и начал создавать Lambda и играть с DynamoDB.
Я боролся много часов, пытаясь понять, почему я получаю страшную ошибку The provided key element does not match the schema
и я наконец сломался и бросил 1
вместо id
.К моему шоку Lambda наконец-то сработала.Еще играю, и я обнаружил, что мне нужно сделать parseInt(id)
.
Может кто-нибудь объяснить, почему?Ниже приведен мой простой лямбда для обновления столбца.
var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});
var ddb = new AWS.DynamoDB;
var docClient = new AWS.DynamoDB.DocumentClient();
function updateField(id) {
var params = {
TableName: 'MyTable',
Key: {
'Id': parseInt(id)
},
UpdateExpression: `SET #c = :val`,
ExpressionAttributeNames: {
'#c': 'MyField'
},
ExpressionAttributeValues: {
":val": 1
},
ReturnValues: "UPDATED_NEW"
};
docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("Updated");
}
});
}
exports.handler = function(event, context) {
ddb.scan({
TableName: 'MyTable',
Limit: 1
}, function(err, data) {
if (err) {
console.log("Error", err);
} else {
var item = data.Items[0];
updateField(item.Id.N);
}
});
};
Я читаю значение Id
прямо из DynamoDB и использую свойство N
.Почему я должен анализировать его для int, чтобы использовать его снова?Это мой неспособность понять что-то такое простое в JavaScript или DynamoDB делает то, чего я не ожидаю?
//Works
Key: {
'Id': parseInt(id)
}
//Does not work even though id came right from the database
Key: {
'Id': id
}