仅在DynamoDB中更新多个属性

时间:2017-10-11 22:31:28

标签: node.js lambda amazon-dynamodb aws-sdk serverless-framework

使用以下代码,我成功更新了一个项目

https://github.com/serverless/examples/blob/master/aws-node-rest-api-with-dynamodb/todos/update.js#L22-L37

const params = {
  TableName: process.env.DYNAMODB_TABLE,
  Key: {
    id: event.pathParameters.id,
  },
  ExpressionAttributeNames: {
    '#todo_text': 'text',
  },
  ExpressionAttributeValues: {
    ':text': data.text,
    ':checked': data.checked,
    ':updatedAt': timestamp,
  },
  UpdateExpression: 'SET #todo_text = :text, checked = :checked, updatedAt = :updatedAt',
  ReturnValues: 'ALL_NEW',
};

然后我添加更多属性:

  const params = {
    TableName: process.env.DYNAMODB_TABLE,
    Key: {
      id: event.pathParameters.id,
    },
    ExpressionAttributeNames: {
      '#user_name': 'name',
    },
    ExpressionAttributeValues: {
      ':name': data.name,
      ':email': data.email,
      ':username': data.username,
      ':password': data.password,
      ':checked': data.checked,
      ':updatedAt': timestamp,
    },
    UpdateExpression: 'SET #user_name = :name, email = :email, username = :username, password = :password, checked = :checked, updatedAt = :updatedAt',
    ReturnValues: 'ALL_NEW',
  };

如果我提供所有属性,则上述代码可以正常工作。

$ cat test/user-1.json
{
  "name": "Bob",
  "email": "bob@example.com",
  "username": "bob",
  "password": "adfdsfdsf",
  "checked": false
}

但如果我只想更新部分内容,因为我每次都不需要更新电子邮件和密码,我收到错误Couldn't fetch the user item.

$ cat test/user-1.json
{
  "name": "Bob",
  "username": "bob-1",
  "checked": false
}

$ curl -X PUT ${url}/${id} --data '@test/user-1.json'
Couldn't fetch the user item.

那么如何更改我不需要更新所有属性的代码。

2 个答案:

答案 0 :(得分:0)

Update API调用无效,因为data.email和data.password未定义。

如果您不需要更新这些属性,我建议更改UpdateExpression。

答案 1 :(得分:0)

我知道这很老了,但是如果有人遇到这个问题,我基本上建立了一个params工厂-我有一个函数返回我的params和我的ExpressionAttributeValues对象和UpdateExpression字符串仅包含通过我的验证的变量