我想编写一个更新dynamodb中给定参数的函数。
例如在dynamodb表中,每个userId都是键,我有
之类的值
{
"categoryname": "a",
"skillState": "a",
"skipcount": 1,
"userId": "amzn1.ask.account.xxx”
}
我想设置"categoryname": "b"
虽然可能有10-15个这样的字段所以我不想硬编码字段名称。
function (userId,itemToUpdate,itemValue,callback) {
var updateExpressionString = "SET #"+itemToUpdate+" =:val1";
var expressionAtt = '#'+itemToUpdate + '';
console.log(updateExpressionString)
console.log(expressionAtt)
this.dynamodb.updateItem({
TableName: constants.dynamoDBDetailTableName,
Key: {
userId: {
S: userId
}
},
UpdateExpression: updateExpressionString,
ExpressionAttributeNames : {
expressionAtt : itemToUpdate
},
ExpressionAttributeValues : {
':val1': {'S':itemValue}
}
}, function (err, data) {
if (err) {
console.log(err)
console.log('Error ')
} else if (data.Item === undefined) {
}else {
console.log(data)
}
});
}
在ExpressionAttributeNames中:
{ValidationException:ExpressionAttributeNames包含无效密钥:语法错误; key:“expressionAtt”
这会引发错误,显然认为expressionAtt
是关键,而它是一个局部变量。
我是node.js的新手,如何将局部变量传递给ExpressionAttributeNames
和ExpressionAttributeValues
答案 0 :(得分:2)
解决这个问题的一种方法是将对象拉出updateItem
,将其放入自己的变量中,如下所示:
var item = {
TableName: constants.dynamoDBDetailTableName,
Key: {
userId: {
S: userId
}
},
UpdateExpression: updateExpressionString,
ExpressionAttributeNames: {},
ExpressionAttributeValue: {
':val1': {'S': itemValue}
}
};
item.ExpressionAttributeNames[expressionAtt] = itemToUpdate;
this.dynamodb.updateItem(item);
我相信这会解决你的问题