【问题标题】:cant update using updateExpression on Dynamodb using nodejs无法使用节点 js 在 Dynamodb 上使用 updateExpression 进行更新
【发布时间】:2021-10-10 10:59:51
【问题描述】:

这是我的数据结构-

{
      "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
      }
}

我一直在 updateExpression 下面尝试这个,但由于某种原因,它甚至没有给出关于 cloudwatch 有什么问题的线索。在下面的代码中,我只是尝试更新 displayName 属性的值,不确定如何添加额外属性的代码。 cloudwatch 日志也不会打印错误原因。我已经阅读了有关 aws 的文档以及其他一些 stackoveflow 帖子。我无法完成这项工作。

主 Lambda 处理程序 -

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;

这是在 cloudwatch 中打印出来的内容以及一些账单信息 2021-10-09T16:25:15.527Z b1a1e4cb-6001-415c-82a3-cfdc90413e4e 信息 USER-12560000000 Sam www.bol.com

【问题讨论】:

  • 你想如何运行它?作为 AWS Lambda 函数?
  • 没错,我正在从 graphql api 调用 lambda 函数
  • 您的代码没有定义 AWS Lambda 处理程序。它不是有效的 Lambda 函数。你包括你的整个代码吗? Lambda 函数的日志实际上显示了什么?
  • 我已将 lambda 函数添​​加到原始帖子以及 cloudwatch 日志中
  • 投反对票是因为您没有提供调试问题所需的所有信息,包括所有代码和日志。我认为您需要将 await 添加到 updateUser 调用中。也可能是dynamodb.update() 电话。

标签: node.js amazon-web-services aws-lambda amazon-dynamodb


【解决方案1】:

你的UpdateExpression & ExpressionAttributeValues 错了,应该是:

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

Key 对象也将键作为 string,因此您的 Key 对象需要如下所示:

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

要更新/插入多个字段,以下将起作用:

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

【讨论】:

  • 试过你的答案,不行。
  • 错误是什么?
  • 我已更新原始帖子以包含更多信息。我正在添加 updatedAt 属性,而不是修改。
  • @Sumchans 检查更新的答案 - 也许 DynamoDB 也让:data 感到困惑,所以我已经改变了它 - 这行得通吗?如果没有,请告诉我 API 的响应是什么
  • 对不起ermiya,我只是尝试单独在名称字段上进行更新,但仍然无法正常工作。 cloudwatch 日志没有说明该错误。添加 cloudwatch 日志的片段。
【解决方案2】:

像下面这样更改 dynamodb.update 后一切正常。

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

这是遇到此问题的任何人的完整代码。

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;

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多