n8n : utiliser les expressions sans casser les types JSON
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 siuserest absent. Préférez{{$json.user?.name ?? 'inconnu'}}.- Un nombre concaténé dans une chaîne devient du texte.
- Un tableau transformé par
joinne 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.