Philip Kirkbride
Philip Kirkbride

Reputation: 22899

DynamoDb Update an Item from Node.js

I had the following code which originally worked for creating a user.

var params = {
  TableName: 'myproject-user',
  Item: {
    id: req.body.userName,
    email: req.body.email
  }
};

if(req.body.currency) {
  params.Item.currency = {
    type: req.body.currency.type,
    bank: req.body.currency.bank,
    amount: req.body.currency.amount,
  }
}

docClient.put(params, function(err, data) {
  if (err) {
    res.send({
      success: false,
      message: 'Error: ' + err
    });
  } else {
    const { Items } = data;
    res.send({
      success: true,
      message: 'Added user',
      email: req.body.email
    });
  }
});

I'm now switching to put to update, as I want to be able to keep any existing values on the object while updating the email or name. In addition I have added the following line in the params object to specify the key which is id.

Key: { id : req.user.sub },

The doc.update code executes and I get back status 200 as if there was no problem, but when I look at the table the information hasn't been updated.

Do I need to use an expression or something to get update to work?

Code with changes:

var params = {
  TableName: 'myproject-user',
  Key: {"id":req.user.sub},
  Item: {
    id: req.body.userName,
    email: req.body.email
  }
};

docClient.update(params, function(err, data) {
  if (err) {
    res.send({
      success: false,
      message: 'Error: ' + err
    });
  } else {
    const { Items } = data;
    res.send({
      success: true,
      message: 'Added user',
      email: req.body.email
    });
  }
});

Upvotes: 1

Views: 728

Answers (1)

Philip Kirkbride
Philip Kirkbride

Reputation: 22899

I was able to get this working by using UpdateExpression, ExpressionAttributeValues, and ReturnValues attributes instead of Item, as described here:

var params = {
  TableName: 'krncdev-user',
  Key: {"id":req.user.sub},
  UpdateExpression: "set email=:e",
  ExpressionAttributeValues:{
      ":e": req.body.email
  },
  ReturnValues:"UPDATED_NEW"
};

Upvotes: 1

Related Questions