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

使用AWS SDK for JavaScript调用DynamoDB条件更新失效求助

问题根源与修复方案

我一眼就看出问题出在哪了——你对DynamoDB项的属性路径理解错了!结合你的表格描述和代码来看,这直接导致条件判断完全失效。

为什么条件会被忽略?

你的UserStats表中,Username为Talia的项,直接拥有score和dateCompleted顶级属性,但你的UpdateExpression和ConditionalExpression却在操作Cindy.score这个嵌套属性。这会引发两个关键问题:

  1. 原项中根本没有Cindy这个属性,DynamoDB对不存在的数字属性会默认当作0处理,0 <= 50永远为true,所以条件永远满足,每次都会执行更新。
  2. 你实际想更新的是Talia的分数,但现在每次操作都会给项新增一个Cindy嵌套对象,完全偏离了需求。

修正后的代码

1. 修正请求参数(核心修复)

const dynamoParams = {
  TableName: 'UserStats',
  Key: { username: 'Talia' },
  // 直接操作顶级属性,匹配你的表格结构
  UpdateExpression: 'SET score = :score, dateCompleted = :dateCompleted',
  ExpressionAttributeValues: {
    ':score': 50,
    ':dateCompleted': '2017-12-31' // 注意:你原来的2017-12-99是无效日期,已修正
  },
  ReturnValues: 'UPDATED_NEW',
  // 严格符合需求:新分数>当前分数才更新
  ConditionalExpression: 'score < :score'
};

2. 修复异步函数写法

你混合使用了async/await和回调函数,会导致返回值异常,改成标准的async/await写法:

async function updateUserStats(dynamoParams) {
  try {
    const data = await dynamodb.update(dynamoParams).promise();
    console.log("Woot: ", data);
    return "Successfully updated user! " + JSON.stringify(data, null, 2);
  } catch (err) {
    console.log("err: ", err);
    return "Unable to update item. Error JSON: " + JSON.stringify(err, null, 2);
  }
}

额外说明

如果你的表格结构确实是嵌套类型(比如Talia项里有Cindy对象),那必须确保原项中存在Cindy.score属性,否则条件判断依然会失效。但根据你的表格描述,显然不是这种情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:05:05