Node.js/DynamoDB API中DELETE请求触发ValidationException异常问题排查
看起来你已经做了不少细致的排查工作了,这个ValidationException报错确实挺让人挠头的。结合你提供的代码和检查项,我觉得可以从这几个容易忽略的方向再深挖一下:
检查表是否定义了排序键
这是最常见的触发这个报错的原因!如果你的Trivia-app-users表除了userID这个分区键之外,还额外定义了排序键(比如username、createdAt这类),那么DynamoDB的DELETE操作必须同时提供分区键和排序键的完整值,只传分区键是不符合表结构要求的。你可以登录AWS控制台,找到该表的「键结构」部分确认是否存在排序键。如果有的话,修改你的params对象,把排序键也补充进去:const params = { TableName: "Trivia-app-users", Key: { "userID": userID, "yourSortKeyName": correspondingValue // 替换成你的排序键名称和对应的值 }, };再次确认表名的完全一致性
虽然你提到GET请求正常,但还是建议你对比一下GET和DELETE代码中使用的TableName是否完全一致——包括大小写、连字符、拼写细节(比如有没有把Trivia写成Triviaa?)。你可以在DELETE代码里加一行console.log("Using table:", params.TableName),和GET请求的表名日志做对比,确保没有误用其他表。验证userID的实际传入值
你已经确认userID是字符串类型,但有没有可能传入的是带有前后空格的字符串?比如请求URL是/api/users?userID= 123,这时!userID的判断会通过(因为不是空值),但实际传入的userID是带空格的,和表中存储的纯ID不匹配。建议你在代码里添加日志:console.log("Deleting user with ID:", JSON.stringify(userID)),看看实际传入的内容是否和表中存在的条目完全一致(包括大小写、特殊字符)。用AWS CLI做测试验证
为了排除代码层面的问题,你可以尝试用AWS CLI手动执行DELETE操作:aws dynamodb delete-item --table-name Trivia-app-users --key '{"userID": {"S": "someUserID"}}' --region your-aws-region如果CLI执行成功,说明问题出在你的Node.js代码逻辑里;如果CLI也报同样的
ValidationException,那大概率是表结构或者权限配置的问题(不过你GET能正常访问,权限问题可能性较低)。
备注:内容来源于stack exchange,提问作者Dev

