DynamoDB — The expression can not be empty

TL;DR — Du hast einen Expression-Parameter (FilterExpression, KeyConditionExpression, ProjectionExpression, UpdateExpression oder ConditionExpression) als leeren String "" übergeben. DynamoDB verlangt, dass Expression-Parameter entweder eine gültige, nicht leere Expression oder ganz abwesend sind — ein leerer String ist ungültig. Nimm den Parameter nur auf, wenn du tatsächlich eine Expression hast; andernfalls lass den Schlüssel weg.

Was es bedeutet

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

DynamoDB behandelt einen leeren String anders als einen weggelassenen Parameter. FilterExpression wegzulassen bedeutet "kein Filter"; FilterExpression: "" zu übergeben bedeutet "hier ist ein Filter" — und dann gibt es nichts zu parsen, sodass die Validierung fehlschlägt. Dasselbe gilt für jeden Expression-Parameter.

Warum es passiert

  • Bedingt gebaute Parameter immer gesetzt — Code hängt immer FilterExpression an das Request-Objekt an und lässt es dann "", wenn kein Filter gewählt wurde.
  • Ein Helper/ORM/Connector, der einen leeren Expression-String ausgibt, statt den Schlüssel wegzulassen, wenn die Filterliste leer ist.
  • String-Verkettung, die nichts erzeugte — das Verbinden eines leeren Arrays von Bedingungen ergibt "".
  • Weggetrimmter Inhalt — Platzhalter wurden entfernt und eine leere Expression blieb zurück.

So behebst du es

  1. Setze den Parameter nur, wenn er nicht leer ist. Baue das Params-Objekt bedingt: if (filter) params.FilterExpression = filter; — weise nie "" zu.
  2. Lösche leere Schlüssel vor dem Aufruf — entferne jede Expression-Eigenschaft, deren Wert ein leerer/Whitespace-String ist, aus dem Request.
  3. Sichere deinen Builder ab — wenn die Liste der Bedingungen leer ist, hänge die Expression gar nicht an.
  4. Denk daran, dass sie unabhängig sindExpressionAttributeNames/Values sollten ebenfalls weggelassen werden (nicht {}, auf das nichts verweist), wenn keine Expression sie verwendet.
  5. Für einen Volltabellen-Read ist ein Scan ohne FilterExpression korrekt — lass den Parameter weg, statt einen leeren zu übergeben.

Prototypst du Abfragen, bevor du sie in Code einbaust? Führe sie in der DynoTable-Desktop-App aus — sie sendet nur die Expression-Parameter, die du tatsächlich ausfüllst, sodass du keinen Leerer-String-Filter auslieferst.

Verwandte Fehler

Referenzen

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.