IF v2 node retourne FALSE pour $vars.X === $json.Y malgré des chaînes identiques (Cloud v1.123.43)

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, valeur b8133d71b3f96bc630e3bb0a, 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

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érale b8133d71b3f96bc630e3bb0a pour 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.

1 « J'aime »

Comme vous avez déjà un nœud Code pour les diagnostics, effectuez la vérification dans ce nœud Code et produisez simplement un booléen :

return {
  isValid: $json.query.staff_key === $vars.staff_key
};

Ensuite, définissez votre nœud IF sur : {{ $json.isValid }} -→ Boolean -→ is true.

Cela vous aide-t-il ?

1 « J'aime »

Hey, merci beaucoup ! Ça a vraiment aidé :slight_smile:

2 « J'aime »

C’est bon à savoir