DynamoDB使用AttributeValue执行updateItem报ValidationException异常
异常产生原因
报错的核心原因是你混用了DynamoDB两类客户端的参数格式要求:
你代码里初始化的是AWS.DynamoDB.DocumentClient,这是AWS提供的高阶封装客户端,设计目的就是简化参数编写,自动完成JavaScript原生类型和DynamoDB底层AttributeValue类型的双向转换:
- 对低阶原生
AWS.DynamoDB客户端来说,所有属性值必须手动标注类型,比如字符串写为{S: '字符串值'}、数字写为{N: '数字字符串'},否则接口无法识别值类型。 - 对
DocumentClient来说,你只需要直接传入JavaScript原生值即可:字符串直接传'字符串值'、数字直接传1,客户端会在发请求前自动帮你包装成符合DynamoDB要求的带类型标注的格式。
你最初构造的参数是给低阶客户端用的带类型包装的格式,传给DocumentClient之后,客户端不会识别这是已经包装好的类型值,反而会把{N: '1'}、{S: 'xxx'}这类普通JS对象当成DynamoDB的MAP类型处理。此时你在ADD操作里传入的操作数实际是MAP类型,而ADD仅支持对数字、集合类型做增量/追加操作,自然就抛出了操作数类型不匹配的校验异常。
解决方法
二选一即可:
- 保留当前DocumentClient的用法:所有Key、ExpressionAttributeValues参数都直接传入JavaScript原生值,不要手动加
{S: ''}/{N: ''}这类类型包装,也就是你测试通过的第二种参数写法,这也是DocumentClient的官方推荐用法,代码更简洁不易出错。 - 如果你希望手动编写带类型标注的AttributeValue格式参数:把初始化的客户端换成低阶原生客户端,也就是把
new AWS.DynamoDB.DocumentClient()替换为new AWS.DynamoDB(),调用其updateItem方法,此时你最初写的带类型包装的参数就可以正常执行。
内容的提问来源于stack exchange,提问作者phuwin
相关产品推荐
相关产品推荐

