DynamoDB — The expression can not be empty

TL;DR — 式パラメータ(FilterExpressionKeyConditionExpressionProjectionExpressionUpdateExpression、または 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/コネクタ
  • 何も生まなかった文字列連結 — 空の条件配列を結合すると "" になる。
  • 削られたコンテンツ — プレースホルダーが取り除かれ、空の式が残った。

修正方法

  1. 空でないときのみパラメータを設定します。 params オブジェクトを条件付きで組み立てます: if (filter) params.FilterExpression = filter; — 決して "" を代入しないでください。
  2. 呼び出し前に空のキーを削除します — 値が空/空白の文字列である式プロパティをリクエストから取り除きます。
  3. ビルダーをガードします — 条件のリストが空なら、式をまったく付けないでください。
  4. それらが独立していることを忘れないでください — それらを使う式がないとき、ExpressionAttributeNames/Values も省略します(何にも参照されない {} ではなく)。
  5. テーブル全体の読み取りにはFilterExpression なしの Scan が正しいです。空のものを渡すのではなく、パラメータを省略します。

コードに組み込む前にクエリをプロトタイプしていますか?DynoTable デスクトップアプリ で実行しましょう。実際に入力した式パラメータのみを送るため、空文字列のフィルターを出荷することはありません。

関連するエラー

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。