Ich poste das, weil es mich ein paar Stunden gekostet hat und es fehlschlägt lautlos – die schlimmste Kombination. Falls du etwas Wichtiges durch einen IF- oder Switch-Node auf Basis eines Boolean routest, lohnt sich zehn Minuten deiner Zeit dafür.
Es gibt mehrere offene Issues und Forum-Threads, die dieses Verhalten beschreiben, ohne eine Root Cause anzugeben. Das ist, was ich gefunden habe.
Das Symptom
Ich hatte einen Switch-Node, der entschied, ob eine Benachrichtigung gesendet werden sollte. Die Ausgabe des vorgelagerten Node sah so aus:
{ “shouldEscalate”: true }
Switch-Bedingung: value:
{{ $(‘Extract Response’).first().json.shouldEscalate }}
operator: Boolean → is true
Jede Ausführung routete false. Kein Fehler. Ausführung als Erfolg gemeldet. Der Alert wurde einfach nie ausgelöst.
Was es nicht war
Ich habe zunächst Zeit auf die falschen Hypothesen verschwendet, daher hier die Liste, um dir die Tour zu sparen:
• Nicht .first() vs .item — ich habe überprüft
• Nicht ein Multi-Run-/Item-Lineage-Problem
• Nicht der vorgelagerte Node, der den falschen Wert produziert
Das letzte habe ich bewiesen, indem ich einen Set-Node direkt vor dem Switch platziert habe, der den rohen Wert plus seinen Typ ausgab: { “val”: true, “type”: “boolean”, “runs”: 1 }
Echter Boolean. Ein einziger Run. Korrekter Wert, der beim Node ankommt. Und der Switch sendete immer noch false.
Die eigentliche Ursache
n8n rendert {{ }} Expression-Ausgaben als Text. So kommt ein echter Boolean true beim Operator als String “true” an – und wenn es Leerzeichen am Ende oder einen Zeilenumbruch im Parameterfeld nach der schließenden }} gibt (sehr leicht beim Einfügen zu verursachen), erhältst du "true ".
Der strikte Boolean-Operator erhält "true ", das ist kein Boolean, und der Vergleich schlägt fehl. Lautlos, in die false-Richtung.
Schließlich gab der Node es wörtlich aus: Wrong type: 'true ’ is a string but was expecting a boolean
Warum die offensichtlichen Fixes nicht funktioniert haben
Ich versuchte, die Umwandlung innerhalb des Ausdrucks durchzuführen:
{{ String($(‘Extract Response’).first().json.shouldEscalate).trim().toBoolean() }}
Immer noch fehlgeschlagen. Das Leerzeichen befindet sich nicht im Ausdruck – es wird während n8ns eigenem Rendering nach }} eingeführt. Nichts, was du innerhalb der Klammern tust, kann es erreichen.
Das Umschalten von „Convert types where required