DynamoDB — The expression can not be empty

TL;DR — 你把一个表达式参数(FilterExpressionKeyConditionExpressionProjectionExpressionUpdateExpressionConditionExpression)作为空字符串** "" 传入了。DynamoDB 要求表达式参数要么是一个有效的非空表达式,要么完全不存在——空字符串是无效的。只在你确实有一个表达式时才包含该参数;否则省略该键。**

含义

ValidationException: Invalid FilterExpression: The expression can not be empty;
ValidationException: Invalid KeyConditionExpression: The expression can not be empty;

DynamoDB 对空字符串的处理与省略参数不同。省略 FilterExpression 意味着"没有过滤器";传入 FilterExpression: "" 意味着"这里有一个过滤器"——然后没有东西可解析,因此验证失败。这适用于每一个表达式参数。

为什么会发生

  • 有条件构建的参数总是被设置——代码总是把 FilterExpression 附加到请求对象上,然后在没有选择过滤器时把它留作 ""
  • 一个辅助工具/ORM/连接器在过滤器列表为空时发出一个空表达式字符串,而不是丢掉该键。
  • 产生了空的字符串拼接——连接一个空的条件数组得到 ""
  • 被修剪掉的内容——占位符被剥离,留下一个空表达式。

如何修复

  1. 只在参数非空时才设置它。 有条件地构建参数对象:if (filter) params.FilterExpression = filter;——绝不赋 ""
  2. 在调用前删除空键——从请求中剥离任何值为空/空白字符串的表达式属性。
  3. 守护你的构建器——如果条件列表为空,就根本不附加表达式。
  4. 记住它们是独立的——当没有表达式使用它们时,ExpressionAttributeNames/Values 也应该被省略(而不是没有任何东西引用的 {})。
  5. 对于全表读取,一个没有 FilterExpressionScan 是正确的——省略该参数而不是传入一个空的。

在把查询接入代码之前原型化它们?在 DynoTable 桌面应用里运行它们——它只发送你实际填写的表达式参数,因此你不会交付一个空字符串过滤器。

相关错误

References

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。