Salut à tous, j’ai essayé de déboguer ça avec Claude, mais ça n’a pas vraiment fonctionné, donc je me demandais si quelqu’un pouvait m’aider. L’explication est ci-dessous :
J’ai un workflow Webhook → IF v2 où l’IF compare un paramètre de requête à une Variable de Projet. Les deux se résolvent en la même chaîne, mais l’IF route toujours vers FALSE. La seule solution est de remplacer la référence à la variable par la valeur littérale, ce qui n’a aucun sens.
Configuration
- n8n Cloud, version 1.123.43
- Variable globale : clé
staff_key, valeurb8133d71b3f96bc630e3bb0a, portée Global - Webhook reçoit l’URL :
?staff_key=b8133d71b3f96bc630e3bb0a - IF v2 condition unique :
- Valeur 1 :
{{ $json.query.staff_key }}(expression) - Opérateur :
String → is equal to - Valeur 2 :
{{ $vars.staff_key }}(expression) - Options → « Convertir les types si nécessaire » : ON
- Valeur 1 :
Diagnostic
J’ai inséré un nœud Code entre le Webhook et l’IF pour inspecter les valeurs en JavaScript brut :
const fromUrl = $json.query.staff_key;
const fromVar = $vars.staff_key;
return {
fromUrl,
fromUrl_length: fromUrl?.length,
fromUrl_type: typeof fromUrl,
fromVar,
fromVar_length: fromVar?.length,
fromVar_type: typeof fromVar,
strict_equal: fromUrl === fromVar,
loose_equal: fromUrl == fromVar
};
Résultat :
fromUrl: "b8133d71b3f96bc630e3bb0a"
fromUrl_length: 24
fromUrl_type: "string"
fromVar: "b8133d71b3f96bc630e3bb0a"
fromVar_length: 24
fromVar_type: "string"
strict_equal: true
loose_equal: true
Ainsi, au niveau du JS, les deux valeurs sont byte-identiques, du même type, et === et == retournent tous les deux true.
Choses que j’ai essayées
- Activer/désactiver « Convertir les types si nécessaire » dans les deux cas — aucune différence, les deux routent vers FALSE.
- Supprimer et recréer la variable pour éliminer l’hypothèse d’espaces blancs en fin de chaîne.
- Réenregistrer le workflow et récouter les événements de test entre les tentatives.
- Mettre
{{ $json.query.staff_key }}pour la Valeur 1 et la chaîne littéraleb8133d71b3f96bc630e3bb0apour la Valeur 2 et supprimer la variable globale staff_key — Ça marche immédiatement et discrimine correctement.
Question
Pourquoi le nœud IF v2 refuse-t-il d’évaluer $vars.X === $json.Y comme true quand JavaScript brut confirme que ce sont des chaînes strict-equal ? Y a-t-il une différence connue dans le wrapping de type entre la façon dont $vars et $json sont présentés à l’évaluateur interne du nœud IF ? Y a-t-il une solution qui préserve la référence à la variable ?
Le workflow fonctionne actuellement bien avec la valeur littérale, mais je préférerais router les secrets via des Variables pour une future rotation.