DynamoDB — The expression can not be empty

TL;DR — Tu as passé un paramètre d'expression (FilterExpression, KeyConditionExpression, ProjectionExpression, UpdateExpression ou ConditionExpression) sous forme de chaîne vide "". DynamoDB exige que les paramètres d'expression soient soit une expression valide non vide, soit totalement absents — une chaîne vide est invalide. N'inclus le paramètre que lorsque tu as réellement une expression ; sinon, omets la clé.

Ce que ça signifie

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

DynamoDB traite une chaîne vide différemment d'un paramètre omis. Omettre FilterExpression signifie « pas de filtre » ; passer FilterExpression: "" signifie « voici un filtre » — et il n'y a alors rien à analyser, donc la validation échoue. La même chose s'applique à chaque paramètre d'expression.

Pourquoi ça arrive

  • Des paramètres construits conditionnellement mais toujours définis — le code attache toujours FilterExpression à l'objet de requête, puis le laisse à "" quand aucun filtre n'a été choisi.
  • Un helper/ORM/connecteur qui émet une chaîne d'expression vide au lieu de retirer la clé quand la liste de filtres est vide.
  • Une concaténation de chaînes qui n'a rien produit — joindre un tableau vide de conditions donne "".
  • Contenu supprimé au nettoyage — les placeholders ont été retirés, laissant une expression vide.

Comment le corriger

  1. Ne définis le paramètre que lorsqu'il est non vide. Construis l'objet de paramètres conditionnellement : if (filter) params.FilterExpression = filter; — n'assigne jamais "".
  2. Supprime les clés vides avant l'appel — retire de la requête toute propriété d'expression dont la valeur est une chaîne vide/composée d'espaces.
  3. Protège ton builder — si la liste de conditions est vide, n'attache pas du tout l'expression.
  4. Rappelle-toi qu'ils sont indépendantsExpressionAttributeNames/Values devraient aussi être omis (pas un {} référencé par rien) quand aucune expression ne les utilise.
  5. Pour une lecture de table complète, un Scan sans FilterExpression est correct — omets le paramètre plutôt que d'en passer un vide.

Tu prototypes des requêtes avant de les câbler dans ton code ? Lance-les dans l'application de bureau DynoTable — elle n'envoie que les paramètres d'expression que tu remplis réellement, donc tu ne livreras pas de filtre en chaîne vide.

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

DynoTable est un client de bureau rapide pour DynamoDB — parcours les tables, exécute des requêtes de style SQL et édite les items en local.