Begriff
n8n Loop Node (SplitLab)
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.
In der Programmierung sind Schleifen (for, while) essenziell.
In n8n machst du das visuell mit dem Loop Node (früher "SplitInBatches").
Du hast eine Liste von 100 Kunden (JSON Array).
Du willst für jeden Kunden eine Email senden.
Wenn du einfach den "Email Senden" Node dranhängst, macht n8n das oft automatisch ("Impliziter Loop").
Aber manchmal willst du es kontrollieren: "Mache immer 10 Stück, dann warte 1 Minute."
Oder du hast eine komplexe Logik pro Item.
Der Loop Node nimmt die Liste, gibt dir ein Item (oder einen Batch), führt den Rest des Flows aus und springt dann zurück zum Anfang, bis die Liste leer ist.
Merksatz: Ein Node in n8n, der eine Liste von Datenobjekten iteriert, um nachfolgende Operationen für jedes Element (oder in Gruppen/Batches) einzeln auszuführen.
- Input: Ein Array mit 50 Items (
[{name: "A"}, {name: "B"}, ...]). - Loop Over Items Node:
Batch Size: 1 (Verarbeite jeden einzeln).
- Operation: "HTTP Request" (Sende an API).
- Loop End: Verbinde den Ausgang des HTTP Request zurück zum Loop-Eingang? Nein! In n8n Version 1.0 gibt es einen speziellen Loop-Output. Nichts manuell verbinden! Der Node hat einen "Loop" Ausgang für die Schleife und einen "Done" Ausgang, wenn alles fertig ist.
1. Batch Size & Rate Limits
APIs erlauben oft nur 100 Requests pro Minute.
Wenn du 1000 Items hast und Batch Size: 1 + Wait: 0s machst, wirst du geblockt (429 Too Many Requests).
Lösung:
Batch Size: 10- Im Loop: "Verarbeite 10 parallel" (oder sequenziell).
- Am Ende des Loops:
Wait Node(1 Sekunde). Das drosselt die Geschwindigkeit auf sichere 600/min.
2. State im Loop (Merging)
Ein Klassiker-Problem:
Du willst Daten aus dem Loop sammeln ("Liste der erfolgreichen IDs").
Variable setzen (Set Node) im Loop überschreibt sich oft selbst oder ist außerhalb nicht sichtbar.
Nutze den Code Node nach dem Loop, um $node['Loop'].json (Alle Iterationen) abzugreifen.
n8n sammelt automatisch alle Resultate der Loop-Durchläufe im "Done"-Zweig.
3. Error Handling (Continue On Fail)
Wenn Item 50 von 100 fehlschlägt (API Down). Standardmäßig stoppt der ganze Workflow. 49 erfolgreich, 1 Fehler, 50 nicht bearbeitet. Setze in den Loop-Nodes (und den Nodes darin): "On Error: Continue". Dann läuft der Loop weiter. Du bekommst am Ende ein Array mit 99 Erfolgen und 1 Fehlerobjekt. Das musst du filtern.
Der Code-Node Bypass (State Aggregation)
Ein berüchtigtes Problem: Du durchläufst 100 PDFs, willst aber nicht 100 HTTP-Requests an eine Aggregations-API senden, sondern am Ende ein riesiges, gebündeltes JSON-Array ([ {pdf1}, {pdf2} ]) mit nur einem Schuss abfeuern.
Wenn du dem "Loop" Ausgang folgst, hast du immer nur das aktuelle Item im Context.
Die Profi-Lösung: Der "Done" (Fertig) Ausgang des Loop Nodes. Nach Abschluss aller 100 Zyklen wirft K8s/n8n das komplette verarbeitete Set exakt an diesem Pin ab. Ein nachfolgender Code-Node iteriert dann in Millisekunden über dieses Array (for (const item of $input.all())) und transformiert es in die massige Einzel-Payload.
Sub-Workflows vs. Loop (Memory Limits)
Der Loop Node stößt bei extremen Workloads (z. B. 50.000 CSV-Reihen) auf massive Grenzen der NodeJS V8 Engine (Heap Max 1.5GB).
Jeder Loop-Umlauf pumpt den Execution-State weiter auf. Bei 50k Umläufen stürzt der Container mit SIGKILL OOM ab.
Die architektonische Erlösung ist der Execute Workflow Node (Sub-Workflows).
Statt einen Loop zu nutzen, jagst du das Array von 50.000 Items in diesen Node. Er "fanned" die Listen-Punkte aus und ruft für jedes Item einen winzigen, isolierten "Child-Workflow" auf. Da die Ausführung der Child-Workflows abgekoppelt an Node.js-Worker-Threads (oder via Redis an andere Container) delegiert und deren lokaler Scope nach dem Return sofort vom Garbage Collector geleert wird, skaliert dieser "Outsourced Loop" faktisch unendlich.
Exponential Backoff im Loop (API-Throttle)
Das statische Wait (Wait Node: 1s im Loop) ist in Firmen-Netzen oft verboten, da es die Ausführung linear verriegelt.
Ein robustes Design nutzt Exponential Backoff.
Schlägt die API im Loop (Item 54) mit Retry = True fehl, fängt ein Fallback-Pfad das Fehlerkonstrukt auf.
Im Loop nutzt man eine Expression im Wait-Node: {{ Math.pow(2, $runIndex) * 1000 }} ms.
Beim ersten API-Limit-Hit wartet die Schleife 2 Sekunden, dann 4, dann 8 und am Ende 16, bis die API das Token Bucket wieder freigibt. Dies ist "Resilience patterns for external integrations".
Quick-Check
Was ist der Unterschied zu "SplitInBatches"?
Der alte Name (Legacy Node). Er funktionierte gleich, hatte aber schlechtere UI (man musste manuell zurück verbinden). Nutze in neuen Workflows immer "Loop Over Items".Parallele Execution?
MitBatch Size > 1laufen die Items innerhalb des Batches im Node parallel (bei HTTP Requests). Aber die Batches selbst laufen sequenziell. Echte Parallelität ("Fan-Out") braucht Sub-Workflows.Endlosschleifen?
Möglich, wenn du "Loop indefinitely" wählst (z. B. Polling: "Prüfe Status bis 'Fertig'"). Hier musst du zwingend einen Zähler einbauen ("Max 10 Versuche"), sonst läuft dein n8n-Server heiß.