Begriff
Expression (n8n)
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Eine Expression ist eine magische Formel, die Werte dynamisch berechnet.
In Excel kennst du das: Du schreibst nicht "100", sondern =A1+B1.
In n8n ist es genauso.
Statt in einem Feld (z. B. "E-Mail Betreff") einen festen Text einzutippen, kannst du sagen:
"Nimm den Namen aus dem vorherigen Schritt und füge 'Hallo' davor."
Das sieht dann so aus: Hallo {{ $json.firstname }}!
Diese geschwungenen Klammern {{ ... }} sind das Zeichen für n8n: "Achtung, hier muss ich rechnen!"
Merksatz: Ein Platzhalter, der erst beim Ausführen durch den echten Wert ersetzt wird.
Das ist die wichtigste Fähigkeit, um n8n zu meistern. Du ziehst meistens per Drag & Drop einen Wert aus dem linken Input-Panel in das Feld rechts. n8n schreibt die Expression dann automatisch für dich.
Häufige Beispiele
- Text kombinieren:
Bestellung Nr. {{ $json.orderId }} von {{ $json.customerName }}. - Rechnen:
{{ $json.price * 1.19 }}(Preis inkl. MwSt). - Datum:
{{ new Date().toISOString() }}(Aktueller Zeitstempel).
Der Unterschied: Fixed vs. Expression
Neben jedem Feld in n8n ist ein kleines Zahnrad oder ein "Add Expression"-Knopf.
- Fixed: Das Feld ist dummer Text.
- Expression: Das Feld ist eine lebendige Formel.
1. JavaScript Power
Alles innerhalb von {{ ... }} ist pures JavaScript.
Das heißt, du kannst alle String-Methoden nutzen:
{{ $json.email.toLowerCase() }}(Alles kleinschreiben).{{ $json.name.split(' ')[0] }}(Nur den Vornamen nehmen).{{ $json.text.replace('Schlecht', 'Gut') }}(Text ersetzen).
2. Zugriff auf andere Nodes
Du kannst nicht nur auf den direkten Vorgänger zugreifen, sondern auf JEDEN Node im Workflow.
Syntax: {{ $('MeinTriggerNode').item.json.body }}.
Das ist extrem mächtig, wenn du Daten von ganz am Anfang brauchst, obwohl du schon 10 Schritte weiter bist.
3. Luxon (Datum & Zeit)
n8n hat die Bibliothek Luxon eingebaut ($now). Damit rechnest du mit Zeiten viel einfacher als mit nativem JS:
{{ $now.plus({ days: 7 }).toFormat('dd.MM.yyyy') }}-> "In 7 Tagen ist der 24.12.2025".
1. Abstract Syntax Tree (AST) & Evaluation Runtime
Expressions in n8n sind keine banalen Regex-Replacer wie in Ansible oder Terraform String-Interpolation.
Unter der Haube passiert in der Laufzeit des Node-Workers ein komplettes Lexing & Parsing Verfahren. Die $(...) oder {{ ... }} Ausdrücke werden über einen JavaScript AST geparst und innerhalb einer gehärteten Contextified Environment Sandbox (Node vm Module) ausgeführt. Das bedeutet, dass der gesamte Memory Graph aller referenzierten Nodes ($node[...].data) exakt in dem Milligramm Execution-Timpepoint asynchron als Object Reference Trees (Pointer) in V8 aufgelöst wird.
Daher fressen extrem dicke mathematische Funktionen inmitten von Iterationsschleifen massivst JIT Compiler Memory. Ein Entwickler sollte schwere Arrays Map/Filter Arbeiten massiv in den Code Node extrahieren, da dort Caching greift, anstatt in jedem Input Input Field 10.000x pro Batch Lauf den AST Neu aufwändig zur Parsing Laufzeit am Proxy Objekt evaluieren zu lassen!
2. $json vs $item vs Node-Tethering
Der Kontext ist oft das Tödlichste an n8n Loops.
Ein Node läuft in einer Node-Batch (100 Items).
$json referenziert immer das absolut exakte Data Object des aktiven Paginierungs-Index.
Aber was, falls ich $('Trigger').item.json.Id aufrufe?
Da der Trigger vielleicht 1 Item hatte, der aktuelle Node aber an einem Array-Teiler hängt und nun 50 Items abspult (Cross-Product-Join), betreibt n8n Item Linking (Tethering) im Hintergrund. Die Engine iteriert den Baum asynchron zurück (Item Matcher), um exakt die "Vater" Ursprungs Zeile in Node-0 zu finden, die diesen abgeleiteten Thread (Node-3 Item Index 42) triggert. Fällt dieses Linking aus (oft durch Array Manipulation im Code-Node), flippt das Expression Evaluation Modul heillos auf [Array] Fallbacks um, und der Wert driftet ab als "Item Not Found" Bug im Logging.
3. Luxon Memoization Penalty & Temporal Types
Die Variable $now im System ist extrem nützlich, führt in Loops jedoch oft zum Desaster.
Jedes Mal wenn in einem n8n Expression Feld {{ $now.toFormat('xx') }} läuft, konstruiert die V8 Engine eine riesige Luxon/Moment.js Wrapper-Objekt Klasse "on the fly" in den Heap Memory mit massiven Timezone/Locale Referenzen.
Wenn das System 100.000 API-Datenreihen am HTTP Call pusht und dort im Auth-Header eine Date-Expression webt, knallt die Instanziierung unfassbar Latenz-fressend auf den Garbage Collector durch.
Enterprise Patterns leiten das Design auf "Cache outside the Box": Ein Set Node am Start bastelt {{ $now }} konstant in eine Flow-Variable $execution.customData. Alle Nodes danach pingen nur pur den konstanten Cache String! Performance boost: 60%.
Quick-Check
Woran erkennst du eine Expression im Editor?
An den doppelten geschwungenen Klammern{{ ... }}und daran, dass der Feld-Titel oft lila wird oder "Expression" dransteht.Kannst du in einer Expression auch rechnen (Mathe)?
Ja, es ist vollwertiges JavaScript. Du kannst addieren, subtrahieren und komplexe Formeln nutzen.Wie greifst du auf Daten zu, die 5 Schritte zurückliegen?
Indem du den Namen des Nodes referenzierst:$('NodeName').item.json....