You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用updateExpression更新DynamoDB失败如何解决?

问题根因

  • 你的updateUser是async函数,但调用dynamoDB.update().promise()时没有加await,Lambda执行流程不会等待DynamoDB请求完成就直接结束,所以既没有错误日志也没有数据更新,请求直接被中断
  • 当前的更新表达式直接给data字段赋值,会覆盖整个data结构,导致原data下的其他属性丢失,不符合你只修改name+新增updatedAt的需求
  • 代码中主键pk写死为固定值USER-12560000000,未使用传入的userId参数,即使请求执行成功也只会更新固定用户的数据
  • 没有配置ReturnValues参数,所以默认返回的data.Attributes为空,看不到更新结果

正确实现代码

修改后的updateUser完整代码如下:

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

async function updateUser(userId, name, avatarUrl) {
  try {
    // 动态拼接更新表达式,支持可选参数按需更新
    const updateExps = []
    const expAttrVals = {}
    
    // 更新data下的name字段
    updateExps.push("data.#name = :name")
    expAttrVals[":name"] = name
    // 新增/更新data下的updatedAt字段
    updateExps.push("data.updatedAt = :updatedAt")
    expAttrVals[":updatedAt"] = Date.now()
    // 传入了avatarUrl则新增/更新该字段
    if (avatarUrl) {
      updateExps.push("data.avatarUrl = :avatarUrl")
      expAttrVals[":avatarUrl"] = avatarUrl
    }

    const updateResult = await dynamoDB.update({
      TableName: "Bol-Table",
      Key: {
        pk: `USER-${userId}`, // 替换为动态传入的用户ID
        sk: "USER",
      },
      UpdateExpression: `SET ${updateExps.join(', ')}`,
      // 规避name为DynamoDB保留字的冲突问题
      ExpressionAttributeNames: {
        "#name": "name"
      },
      ExpressionAttributeValues: expAttrVals,
      // 配置返回更新后的完整数据
      ReturnValues: "ALL_NEW"
    }).promise()

    console.log("更新成功,返回数据:", updateResult.Attributes)
    return updateResult.Attributes
  } catch (err) {
    console.error("更新失败,错误信息:", err)
    throw err
  }
}
module.exports = updateUser;

额外验证点

请确认你的Lambda执行角色已经配置了对应Bol-Table的dynamodb:UpdateItem权限,加了await后如果有权限问题会直接打印在CloudWatch日志中,可直接根据错误提示调整权限配置。

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:09:03