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
相关产品推荐
相关产品推荐

