Begriff
Code Node (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.
Der Code Node ist der Joker im Stapel. Wenn es für deine Aufgabe keinen fertigen Baustein gibt, schreibst du ihn einfach selbst. n8n gibt dir eine leere Textbox, und du kannst dort programmieren, was du willst.
Es ist wie in einer Werkstatt:
- Die normalen Nodes sind fertige Werkzeuge (Hammer, Schraubendreher).
- Der Code Node ist die Schweißmaschine, mit der du dir dein eigenes Spezialwerkzeug baust.
Du kannst damit Daten völlig frei verformen, sortieren, filtern oder komplexe Berechnungen durchführen.
Merksatz: Der Ort, an dem du natives JavaScript oder Python ausführst, um Daten beliebig zu manipulieren.
Du hast die Wahl zwischen zwei Sprachen:
- JavaScript: Der Standard im Web und in n8n.
- Python: Beliebt für Datenanalyse und KI (seit n8n v1.0).
Typische Aufgaben
- Daten aufräumen: Entferne alle Duplikate aus einer Liste von 500 E-Mails.
- Komplexe Logik: "Wenn heute Montag ist UND es regnet, ABER nur wenn der Kunde 'Hans' heißt..."
- Formatierung: Wandle eine CSV-Tabelle in ein JSON-Objekt um, das genau so aussieht, wie deine API es braucht.
Ein einfaches Beispiel (fügt ein neues Feld hinzu):
for (const item of items) {
item.json.neuesFeld = "Hallo Welt";
}
return items;
1. "Run Once for All Items" vs. "Run Once for Each Item"
Das ist die wichtigste Einstellung im Code Node.
- Run Once for All Items (Standard):
Dein Code läuft 1x. Du bekommst ein Array
itemsmit allen Daten (z. B. 100 Kunden). Du musst selbst eine Schleife schreiben (for ...).- Vorteil: Performant. Du kannst items vergleichen (z. B. Duplikate finden).
- Nachteil: Etwas schwieriger zu schreiben.
- Run Once for Each Item:
Dein Code läuft 100x. Du siehst immer nur einen Kunden (
item). n8n macht die Schleife für dich.- Vorteil: Einfach wie eine Expression.
- Nachteil: Du siehst die anderen Kunden nicht (kannst nicht vergleichen).
2. Globale Bibliotheken
Standardmäßig läuft der Code in einer Sandbox (Sicherheit).
Du kannst nicht einfach require('fs') machen und die Festplatte löschen.
Aber: Du kannst in den n8n-Environment-Variables erlauben, bestimmte npm-Pakete zu laden (NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash).
Dann kannst du const _ = require('lodash'); nutzen und hast Superkräfte.
3. State (staticData)
Normalerweise vergisst ein Node alles, sobald er fertig ist.
Mit getWorkflowStaticData('global') kannst du Daten speichern, die bis zum nächsten Lauf überleben.
Use-Case: "Deduplication". Merk dir die ID des letzten verarbeiteten Posts, damit du ihn beim nächsten Mal nicht nochmal postest.
1. V8 Isolate Isolation & Event Loop Blocking
Der JavaScript Code Node ist im n8n-Core nicht einfach eine simple eval() Funktion – das wäre katastrophales Security-Hazarding für Remote Code Execution am Host System!
Stattdessen kapselt n8n den Code in Node.js VM2-Boxen oder V8 Isolates. Diese limitieren radikal den Zugriff auf das Filesystem (fs), process.env oder Netzwerk-Sockets. Alle externen I/O Befehle sind streng beschnitten.
Da JavaScript streng Single-Threaded ist, schießt ein harter while(true) Endlosschleifen-Fehlerkopf den kompletten Execution-Worker-Thread von n8n ab (Event Loop Blocking!). n8n muss dies durch CPU-Watchdogs observieren. Auf Skalierungsseite bedeutet das für DevOps: Intensive Berechnungen (Image-Processing Arrays auf Terabyte Ebene) im Code Node sind Gift, denn sie drosseln in Queue Mode alle anderen parallelen Workflows auf demselben Server-Instanz Core!
2. Stream-Based Chaining ($input API Wrapper)
Ab moderneren n8n Versionen wurde der Code Node refactored, um mit Streaming-Iteratoren zu brillieren (Besonders sichtbar in der $('node') Injection vs $input.all()).
Im Hintergrund manipuliert das n8n-Execution-Engine Arrays aus Objekten in Form von strengen [{json: {}, binary: {}}] Wrappern.
Wenn man 1 Million Zeilen CSV transformiert, verbietet "Run Once for All Items" sich wegen Heap Memory Exhaustion (Out-of-Memory Container Kill).
High-Performance Konstrukte iterieren im Code per Generator/Input Streams über Paging: Sie verarbeiten per "Run Once for Each Item", was bedeutet, n8n verwirft das Payload-Objekt am V8 Garbage Collector nach jedem Lauf. Der Memory Footprint bleibt extrem Flach ($O(1)$) anstatt 1 Million JSON-Objekte stupide parallel in den RAM (Heap) in ein Buffer Array aufzupumpen!
3. Python Execution via Subprocessing (Pyodide vs Native)
Der Einzug von Python im Code Node brachte gigantische Libraries (Pandas, Numpy) ins Spiel. Damit n8n die Sicherheit im Backend wahrt, gibt es gravierende Architekturgrenzen. Standardmäßig kann Python Execution in n8n-Images oft nativ als abgesetzter Child-Subprozess über IPC (Inter-Process Communication) gefeuert werden. Das Data-Binding – das Senden von Megabyte-schweren JSON Items vom Node.js Parent-Prozess in den Python Worker-Thread – erfordert heftige Serialisierung-Kosten im TCP/Socket Stack. Ein Python Code Node Overhead friert die Pipeline oft signifikant ein (hohe Initialization Time von 500ms). Bei zeitkritischen Low-Latency Webhooks bleibt nativer JS-Code immer massiv performanter, da der Overhead im V8 Callgraph absolut vernachlässigbar am JIT-Compiler abperlt.
Quick-Check
Welche zwei Programmiersprachen unterstützt der Code Node?
JavaScript und Python.Warum ist der Code Node "gefährlich" für Anfänger?
Weil ein Syntaxfehler (vergessenes Semikolon) den ganzen Workflow stoppt. Man muss programmieren können.Was ist der Vorteil von "Run Once for All Items"?
Du hast Zugriff auf den gesamten Datensatz gleichzeitig. Das ist nötig für Sortieren, Filtern oder das Finden von Duplikaten.