2016-12-27 30 views
0

我想编写一个函数来更新dynamodb中给定的参数。node.js将参数传递给DynamoDB updateItem方法

例如,在dynamodb表,其中每一个用户id的关键是我喜欢的值

{ "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包含无效重点:语法错误;键:“expressionAtt”

这引发错误显然认为expressionAtt是关键,而它是一个局部变量。

我是新来的node.js,怎么可以通过局部变量在处理这个对ExpressionAttributeNamesExpressionAttributeValues

回答

1

的一种方法是拉出来对象的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); 

我相信,这将解决您的问题