使用AWS SDK for JavaScript调用DynamoDB条件更新失效求助
问题根源与修复方案
我一眼就看出问题出在哪了——你对DynamoDB项的属性路径理解错了!结合你的表格描述和代码来看,这直接导致条件判断完全失效。
为什么条件会被忽略?
你的UserStats表中,Username为Talia的项,直接拥有score和dateCompleted顶级属性,但你的UpdateExpression和ConditionalExpression却在操作Cindy.score这个嵌套属性。这会引发两个关键问题:
- 原项中根本没有
Cindy这个属性,DynamoDB对不存在的数字属性会默认当作0处理,0 <= 50永远为true,所以条件永远满足,每次都会执行更新。 - 你实际想更新的是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
相关产品推荐
相关产品推荐

