DynamoDB遇ValidationException如何解决?如何向其表发送数据?
作为刚入门的开发者,最近在做Angular项目时遇到了个头疼的问题:向DynamoDB发送数据时,浏览器控制台一直弹出ValidationException,折腾了好久,查了一堆视频和GitHub代码,终于在今晚搞定了,成功把数据写入数据库。这里把经验分享出来,这个问题的排查思路和解决方案其实也适用于其他平台和编程语言。
常见异常原因及解决方法
数据类型不匹配
DynamoDB是强类型数据库,每个属性的类型必须和表定义完全一致。比如表中某个字段定义为Number类型,你却传了字符串格式的数字(比如"123"而非123);或者布尔值传成了"true"字符串,而不是原生布尔值true。
解决:检查请求数据结构,确保每个字段的类型和DynamoDB表的定义严格对应。比如在Angular里,要把表单输入的数字转换成数值类型后再发送。必填属性缺失
如果DynamoDB表定义了分区键(或排序键),但请求中没有携带这些字段,就会触发异常。另外,如果表中设置了其他必填属性,未提供也会报错。
解决:核对表的结构,确保请求数据包含所有必填的主键字段和其他必填属性。属性名称违规
不要使用DynamoDB的保留字作为属性名(比如AWS、NAME这类),同时属性名不能包含特殊字符或不符合命名规则。
解决:检查所有属性名称,替换掉保留字,确保名称符合DynamoDB的命名规范(只能包含字母、数字、下划线、点号和破折号,且不能以特殊字符开头)。嵌套数据格式错误
如果表中有Map或List类型的字段,必须严格按照对应格式传值:List要传数组,Map要传键值对对象。比如把List传成了逗号分隔的字符串,就会触发验证失败。
解决:检查嵌套字段的格式,确保和表定义的类型匹配。比如在Angular中,把表单里的多选值整理成数组再发送。数据长度超出限制
DynamoDB对不同类型的数据有长度限制,比如字符串类型最大支持400KB,二进制数据最大支持400KB等。如果数据超出了限制,也会抛出这个异常。
解决:检查数据大小,对过长的内容进行截断或改用其他存储方式(比如把大文件存在S3,然后在DynamoDB中存储文件链接)。
排查小技巧
可以先使用DynamoDB控制台的创建项目功能,手动插入一条符合要求的数据,然后对比手动插入的数据结构和应用发送的数据结构,就能快速找出差异所在。
内容的提问来源于stack exchange,提问作者kdan

