Aller au contenu
Gridpak

n8n : utiliser les expressions sans casser les types JSON

Maxime Aulne

Dans n8n, une expression sert à injecter une valeur dynamique dans un paramètre de nœud. La documentation les décrit comme de petits morceaux de code de type JavaScript placés directement dans les paramètres. Le piège classique : l’expression “marche” visuellement, mais produit un mauvais type, une chaîne vide ou un objet incomplet.

1. Lire la donnée entrante

Avant d’écrire une expression, ouvrez l’exécution précédente et regardez le JSON exact. Si l’item contient {"email":"alice@example.com","price":19.9,"tags":["lead","fr"]}, vous pouvez appeler :

{{$json.email}}
{{$json.price}}
{{$json.tags[0]}}

Ne devinez pas les chemins. Copiez-les depuis la donnée exécutée.

2. Mettre une valeur par défaut propre

Pour éviter une valeur absente, utilisez l’opérateur de coalescence :

{{$json.email ?? null}}
{{$json.price ?? 0}}
{{$json.tags?.[0] ?? 'sans-tag'}}

La valeur par défaut doit avoir le bon type. Si le champ attend un nombre, mettez 0, pas '0'. Si le champ attend un tableau, mettez [], pas une chaîne.

3. Construire un objet JSON

Dans un champ JSON, gardez un vrai objet :

{{ {
  email: $json.email,
  amount: Number($json.price ?? 0),
  source: $json.source ?? 'n8n'
} }}

Ce format évite d’écrire une chaîne qui ressemble à du JSON mais que l’API recevra comme texte.

4. Dates et booléens

Si le contrat accepte uniquement le booléen true ou la chaîne « true », utilisez ce test explicite. Attention : Boolean("false") vaut true, car cette chaîne n’est pas vide.

{{ $json.active === true || $json.active === 'true' }}

Pour une date ISO si la donnée existe :

{{ $json.created_at ? new Date($json.created_at).toISOString() : null }}

Si l’API refuse null, retirez le champ en amont plutôt que d’envoyer une valeur bricolée.

5. Erreurs fréquentes

  • {{$json.user.name}} casse si user est absent. Préférez {{$json.user?.name ?? 'inconnu'}}.
  • Un nombre concaténé dans une chaîne devient du texte.
  • Un tableau transformé par join ne peut plus être traité comme liste par l’API.
  • Une expression copiée depuis un autre nœud peut pointer vers une structure différente.

La bonne règle : inspecter l’item, écrire l’expression, exécuter un seul item de test, puis vérifier le payload réellement envoyé.

Test conseillé

Ajoutez temporairement un nœud Set juste après l’expression pour afficher le résultat dans des champs nommés : debug_email, debug_amount, debug_payload. Exécutez un seul item. Si le type est mauvais à cette étape, il sera mauvais dans l’appel API. Supprimez ensuite les champs de debug pour ne pas polluer la donnée envoyée.

Règle de maintenance

Quand une expression devient trop longue, déplacez la logique dans un nœud Code ou une étape dédiée. Une expression de trois lignes peut rester lisible. Une expression qui fait validation, transformation et fallback devient difficile à auditer après incident.

Exemple complet de payload

{{ {
  customer: $json.email ?? null,
  amount_cents: Math.round(Number($json.price ?? 0) * 100),
  tags: Array.isArray($json.tags) ? $json.tags : [],
  newsletter: ($json.newsletter === true || $json.newsletter === 'true')
} }}

Cet exemple illustre un montant en centimes, un tableau et une permission explicite. Validez le prix avant la conversion ; une chaîne vide ou un nombre invalide ne doit pas devenir un montant accepté. C’est plus fiable qu’une concaténation de chaînes.

Quand préférer un nœud Code

Si vous devez parcourir une liste, filtrer plusieurs conditions ou normaliser des champs imbriqués, passez dans un nœud Code. Gardez l’expression pour lire ou ajuster une valeur simple. Cette séparation rend le workflow plus lisible et facilite le test de l’étape qui transforme vraiment la donnée.

Contrôler avant l’appel externe

Number transforme une chaîne vide en zéro et peut produire NaN sur un texte invalide. Vérifiez le champ dans une condition avant l’appel ; ne remplacez pas silencieusement un prix obligatoire par zéro. De même, une date non vide mais invalide fait échouer toISOString. Un email absent doit aller vers une branche de correction, pas vers une adresse inventée.

Les exemples sont des expressions pédagogiques à coller dans un paramètre passé en mode Expression, pas des fichiers JSON autonomes. Un nom de propriété sans guillemets est valide dans un objet JavaScript, mais pas dans un document JSON brut. Contrôlez le type affiché dans le résultat du nœud avant d’envoyer le payload.

Sources