使用NodeJS操作AWS DynamoDB更新时出现ValidationException报错如何解决
报错原因
- 核心问题是你封装的
UPDATE工具方法中,调用DynamoDB SDK的update接口时,没有把传入的ExpressionAttributeValues参数传递给SDK:你只手动传递了ExpressionAttributeNames,完全漏掉了更新表达式用到的属性值映射参数,导致DynamoDB解析更新表达式时找不到:task对应的定义,抛出校验异常。 - 额外隐藏问题:
updateTask中调用异步的UPDATE方法时没有加await,导致UPDATE方法的异常无法被外层的try/catch捕获,就算执行出错接口也会先返回200响应。- 你的
UPDATE方法内部捕获了异常但没有向外抛出,上层逻辑完全感知不到更新失败的情况。
修复代码
第一步:修改UPDATE方法,补全参数传递 + 错误抛出
const UPDATE = async (payload) => { try { console.log(payload); const updateDoc = await dbClient .update({ TableName: payload.TableName, Key: payload.Key, UpdateExpression: payload.UpdateExpression, ExpressionAttributeNames: payload.ExpressionAttributeNames, // 新增:传递属性值映射参数 ExpressionAttributeValues: payload.ExpressionAttributeValues, ReturnValues: "UPDATED_NEW", }) .promise(); console.log(updateDoc); // 可选:把更新结果返回给上层 return updateDoc; } catch (error) { console.log(error); // 向外抛出错误,让上层可以捕获处理 throw error; } };
第二步:修改updateTask方法,添加await调用
const updateTask = async (req, res) => { try { const { existingTaskText, updatedTaskText } = req.body; console.log(existingTaskText, updatedTaskText); // 新增await等待异步更新完成 await UPDATE({ TableName: "todos", Key: { task: existingTaskText }, UpdateExpression: "set task = :task", ExpressionAttributeValues: { ":task": updatedTaskText }, }); res.status(200).json({ data: "更新成功" }); } catch (error) { res.status(400).json({ message: error.message }); } };
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

