ValidationException: ExpressionAttributeValues contains invalid value

TL;DR — Ein Wert in ExpressionAttributeValues ist leer, hat einen nicht unterstützten Typ, oder ein :platzhalter aus deiner Expression wurde nie definiert. Prüfe, dass jeder :value vorhanden und nicht leer ist.

Was es bedeutet

Häufige Nachrichten:

ValidationException: ExpressionAttributeValues contains invalid value: One or more parameter values were invalid: An AttributeValue may not contain an empty string for key :s
ValidationException: Value provided in ExpressionAttributeValues unused in expressions: keys: {:x}
ValidationException: An expression attribute value used in expression is not defined; attribute value: :v

Warum es passiert

  • Leerer String / leeres Binary — historisch hat DynamoDB "" zurückgewiesen. Leere Strings sind jetzt für Nicht-Schlüssel-Attribute erlaubt (und leere Lists/Maps sind in Ordnung), aber leere Werte in Schlüssel-Attributen und leere Sets sind weiterhin ungültig.
  • Undefinierter Platzhalter — deine Expression referenziert :v, aber ExpressionAttributeValues hat kein :v.
  • Ungenutzter Platzhalter — du hast :x definiert, aber keine Expression verwendet ihn (DynamoDB weist die gesamte Anfrage zurück).
  • Falscher Typ — die Übergabe eines rohen JS-Objekts/undefined/NaN oder (mit dem Low-Level-Client) des falschen {S}-/{N}-Wrappers.
  • Ein leeres Set, das an eine ADD-/DELETE-Operation übergeben wird — diese Klauseln nehmen Set- (oder, bei ADD, Zahlen-)Operanden, und ein Set kann nie leer sein.

So behebst du es

  1. Jeder :value in der Expression muss in ExpressionAttributeValues definiert sein, und jeder definierte Wert muss benutzt werden — halte beides exakt synchron.
  2. Sichere gegen leer/undefined ab. Übergib :v nicht, wenn die Quelle undefined ist; lass stattdessen die Klausel weg. Bei Sets muss mindestens ein Element drin sein.
  3. Nimm den Document Client (@aws-sdk/lib-dynamodb), damit native JS-Werte für dich gemarshallt werden — das beseitigt die meisten Fehler bei Typ-Wrappern.
  4. Gleich die Map gegen den Expression-String ab. Gib beides vor dem Aufruf nebeneinander aus — jedes :token in der Expression muss als Key in ExpressionAttributeValues auftauchen, und jeder Key der Map muss in der Expression vorkommen.
  5. Bei Low-Level-Clients validier die Wire-Typen. Ein leeres Set {SS: []} oder ein fehlender Typ-Wrapper an einem Schlüsselattribut scheitert auch dann, wenn der Platzhalter definiert ist.

Beispiel

import {DynamoDBClient} from '@aws-sdk/client-dynamodb';
import {DynamoDBDocumentClient, UpdateCommand} from '@aws-sdk/lib-dynamodb';

const doc = DynamoDBDocumentClient.from(new DynamoDBClient({}));

const email = getEmail(); // could be undefined
const names = {'#e': 'email'};
const values = {':e': email};

if (email == null) throw new Error('email required'); // don't send :e = undefined

await doc.send(
  new UpdateCommand({
    TableName: 'Users',
    Key: {pk: 'USER#1'},
    UpdateExpression: 'SET #e = :e',
    ExpressionAttributeNames: names,
    ExpressionAttributeValues: values
  })
);

Weg in DynoTable

DynoTables Update-Editor bindet Werte während des Tippens und weist leere Platzhalter zurück, bevor der Request deinen Rechner verlässt. Öffne das Item mit ⌘K, bearbeite ein Feld und sieh dir die erzeugte ExpressionAttributeValues-Map in der Request-Vorschau an — Abweichungen fallen sofort auf statt später als 400 in CloudWatch.

For SDK code you cannot run inline, paste the expression into the Expression Builder and diff its :value map against yours. Wechsle Profile mit ⌘P to test against the same table that threw the error; Verbindung testen on Einstellungen → Profile confirms credentials and region. Setup: Mit AWS verbinden, Installation. Empty sets and undefined JS values are the most common causes — guard both before the call leaves your process.

Quellen

Verwandte Fehler

Referenzen

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

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.