Home > Blockchain >  cant update using updateExpression on Dynamodb using nodejs
cant update using updateExpression on Dynamodb using nodejs

Time:10-10

enter image description hereHere is my data structure -

{
      "pk": "USER-12560000000",
      "sk": "USER",
      "data": {
        "name": "George",  //I want to modify the value of this attribute
        "updatedAt": Date.now()  // I want to add this attribute to the data field
      }
}

I have been trying this below updateExpression, but for some reason it doesn't even give a clue on whats wrong in cloudwatch. In the below code I am only trying to update the value of the displayName attribute, not sure on the code on how to add an extra attribute. The cloudwatch logs dont print the error reason as well. I have read the documentation on aws also a few other stackoveflow posts. I haven't been able to make this work.

Main Lambda Handler -

const updateUser = require('./user-queries/updateUser');
exports.handler = async (event) => {
  var userId = event.arguments.userId;
  var name = event.arguments.name;
  var avatarUrl = event.arguments.avatarUrl;
 console.log(event.info.fieldName);
  switch(event.info.fieldName) {
      case "updateUser":
          return updateUser(userId, name, avatarUrl);
  }
};

const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()

async function updateUser(userId, name, avatarUrl) {
  dynamoDB
    .update({
      TableName: "Bol-Table",
      Key: {
        pk: "USER-12560000000",
        sk: "USER",
      },
      UpdateExpression: `set data = :data`,
      ExpressionAttributeValues: {
        ":data": {
          "name": "Test"
        },
      },
    })
    .promise()
    .then(data => console.log(data.Attributes))
    .catch(console.error)
}
module.exports = updateUser;

This is what gets printed out in cloudwatch along with some billing information 2021-10-09T16:25:15.527Z b1a1e4cb-6001-415c-82a3-cfdc90413e4e INFO USER-12560000000 Sam www.bol.com

CodePudding user response:

Your UpdateExpression & ExpressionAttributeValues are wrong, they should be:

UpdateExpression: `set data.name = :x`
...
ExpressionAttributeValues: {
    ":x": "Test"
}

The Key object also takes in the keys as a string so your Key object needs to look like:

Key: {
    "pk": "USER-12560000000",
    "sk": "USER"
}

To update/insert multiple fields, the below will work:

UpdateExpression: `set data.name = :x, data.updatedAt = :y`
...
ExpressionAttributeValues: {
    ":x": "Test",
    ":y": Date.now()
}

CodePudding user response:

Changing the dynamodb.update like below made it all work after all.

await dynamoDB.update(params).promise();

Here is the full code for anyone who comes across this issue.

const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()

async function updateUser(userId, name, avatarUrl) {
  var params = {
    TableName: "Bol-Table",
    Key: {
      "pk": userId,
      "sk": 'USER',
    },
    UpdateExpression: 'SET details.displayName = :name, details.avatarUrl = :avatarUrl, details.updatedAt = :updateDate',
    ExpressionAttributeValues: {
      ':name': name,
      ':avatarUrl':avatarUrl,
      ':updateDate': new Date().toISOString()
    },

    ReturnValues: 'ALL_NEW'
  };
  const Item = await dynamoDB.update(params).promise();
  console.log(Item)
}
module.exports = updateUser;
  • Related