Supplied AttributeValue is empty, must contain exactly one of the supported datatypes
TL;DR — 你 Item(或键)中的某个属性有一个里面没有值的 AttributeValue——一个空集合、一个键属性中的空字符串/二进制、一个 null/undefined 字段,或一个没有 S/N/BOOL/… 成员的包裹。DynamoDB 要求每个 AttributeValue 恰好持有一个受支持的类型。移除这个空属性或给它一个真实的值。
含义
ValidationException: Supplied AttributeValue is empty, must contain exactly one of the supported datatypesDynamoDB 在验证一个项目的形态时拒绝了请求:一个 AttributeValue 存在,但携带了 DynamoDB 无法存储的空东西。每个 AttributeValue 都必须恰好包含一个带类型的值(S、N、B、SS、NS、BS、M、L、NULL 或 BOOL)。它是一个 HTTP 400,不可重试——在你修复该属性之前,同样的项目会再次失败。
这与 ExpressionAttributeValues contains invalid value 不同:那个是关于表达式中的一个 :placeholder;这个是关于项目体本身(PutItem、BatchWriteItem、TransactWriteItems)中的一个属性。
为什么会发生
- 你正在写入的对象中一个
undefined/null字段——marshaller 发出了一个空的 AttributeValue,而不是跳过它或给它标NULL类型。 - 一个空的 Set——
SS、NS或BS必须至少有一个成员。一个空集合在任何地方都无效。 - 一个键属性中的空字符串——非键的字符串属性可以是
"",但一个表或索引键属性不行。 - 一个键中的空二进制值——与字符串同样的规则:空二进制对非键属性(以及集合、列表和映射内部)没问题,对一个键则绝不行。
- 一个埋在你正持久化的
Map或List中的嵌套空集合——嵌套的空_字符串和二进制值_是允许的;嵌套的空_集合_不允许。
如何修复
- 在写入前剥离空/
undefined属性。 只从确实有值的字段构建Item;丢掉其余的,而不是发送一个空包裹。 - 对文档客户端,启用空值处理。
@aws-sdk/lib-dynamodb的removeUndefinedValues: truemarshal 选项会丢掉undefined字段,使它们永不到达网络。(DynamoDB 直接允许非键属性的空字符串和二进制值。) - 绝不发送一个空 Set——当集合没有成员时完全省略该属性,或者存储一个
NULL。 - 给键属性真实的值——一个分区键/排序键(表或索引)永远不能是空字符串或空二进制。
- 遍历嵌套的 Map/List查找杂散的空集合,如果出问题的属性不在顶层。
常见问题
"Supplied AttributeValue is empty" 在 DynamoDB 中是什么意思? 你项目中的一个属性有一个不包含任何存储值的 AttributeValue——一个键属性中的空字符串或二进制、一个空 Set,或一个 null/undefined 字段。每个 AttributeValue 都必须恰好包含一个受支持的数据类型,因此 DynamoDB 拒绝该写入。
我如何阻止 DynamoDB 拒绝空值? 在写入前移除空的和 undefined 的属性(或使用文档客户端的 removeUndefinedValues 选项)。绝不发送一个空 Set——省略该属性或存储一个 NULL。键属性必须始终携带一个真实的、非空的值。
相关错误
- ExpressionAttributeValues contains invalid value——一个表达式占位符中同类的问题。
- ValidationException (overview)
- 学习:DynamoDB data types · JSON marshalling
参考资料
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- AttributeValue — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。