node.js将参数传递给DynamoDB updateItem方法

时间:2016-12-27 20:27:41

标签: node.js amazon-dynamodb local-variables

我想编写一个更新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的新手,如何将局部变量传递给ExpressionAttributeNamesExpressionAttributeValues

1 个答案:

答案 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);

我相信这会解决你的问题