DynamoDB — The expression can not be empty
TL;DR — 你把一个表达式参数(FilterExpression、KeyConditionExpression、ProjectionExpression、UpdateExpression 或 ConditionExpression)作为空字符串** "" 传入了。DynamoDB 要求表达式参数要么是一个有效的非空表达式,要么完全不存在——空字符串是无效的。只在你确实有一个表达式时才包含该参数;否则省略该键。**
含义
ValidationException: Invalid FilterExpression: The expression can not be empty;
ValidationException: Invalid KeyConditionExpression: The expression can not be empty;DynamoDB 对空字符串的处理与省略参数不同。省略 FilterExpression 意味着"没有过滤器";传入 FilterExpression: "" 意味着"这里有一个过滤器"——然后没有东西可解析,因此验证失败。这适用于每一个表达式参数。
为什么会发生
- 有条件构建的参数总是被设置——代码总是把
FilterExpression附加到请求对象上,然后在没有选择过滤器时把它留作""。 - 一个辅助工具/ORM/连接器在过滤器列表为空时发出一个空表达式字符串,而不是丢掉该键。
- 产生了空的字符串拼接——连接一个空的条件数组得到
""。 - 被修剪掉的内容——占位符被剥离,留下一个空表达式。
如何修复
- 只在参数非空时才设置它。 有条件地构建参数对象:
if (filter) params.FilterExpression = filter;——绝不赋""。 - 在调用前删除空键——从请求中剥离任何值为空/空白字符串的表达式属性。
- 守护你的构建器——如果条件列表为空,就根本不附加表达式。
- 记住它们是独立的——当没有表达式使用它们时,
ExpressionAttributeNames/Values也应该被省略(而不是没有任何东西引用的{})。 - 对于全表读取,一个没有
FilterExpression的Scan是正确的——省略该参数而不是传入一个空的。
在把查询接入代码之前原型化它们?在 DynoTable 桌面应用里运行它们——它只发送你实际填写的表达式参数,因此你不会交付一个空字符串过滤器。
相关错误
- Query key condition not supported——一个格式错误(而非空)的
KeyConditionExpression。 - Invalid UpdateExpression syntax——一个非空但格式错误的更新表达式。
- 学习:Filtering strategies · Key condition expressions
References
- Using expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。