Code
Übersicht
Abschnitt betitelt „Übersicht“Die Operation Code führt ein kurzes JavaScript aus, ähnlich dem Code-Knoten in n8n. Das Skript liest die Ergebnisse des Triggers und der Aktionen davor, formt sie um und gibt ein Objekt zurück, das die nächsten Aktionen wie jedes andere Ergebnis verwenden: {{Name.Response.Schlüssel}}.
Typische Fälle: Summen bilden, eine Liste filtern oder sortieren, Texte zerlegen und zusammensetzen, Datumswerte umrechnen, eine API-Antwort in die Form bringen, die die nächste API erwartet. Für all das reichen Platzhalter nicht, denn sie rechnen nicht.
Im visuellen Editor finden Sie Code unter Logik. Das Formular hat ein Feld für den Code und eines für die Zeitgrenze. Ziehen Sie einen Wert aus der Testansicht in den Code, wird daraus der passende JavaScript-Pfad, z. B. data.KundeLaden.Response.Body.name. Mit Schritt testen sehen Sie das Ergebnis sofort.
Struktur
Abschnitt betitelt „Struktur“{ "Type": "Code", "Name": "Summe", "Parameters": { "Code": "const items = input.Response.Body.items;\nreturn { count: items.length };", "TimeoutSeconds": 30 }}| Parameter | Standard | Bedeutung |
|---|---|---|
Code |
– | Das JavaScript. Es ist der Rumpf einer Funktion: Was es mit return zurückgibt, ist das Ergebnis. |
TimeoutSeconds |
30 |
Nach so vielen Sekunden wird das Skript abgebrochen und die Aktion schlägt fehl; 0 = ohne Grenze. |
Was das Skript lesen kann
Abschnitt betitelt „Was das Skript lesen kann“| Name | Inhalt |
|---|---|
input |
Das Ergebnis der Aktion, die direkt davor fertig wurde, z. B. input.Response.Body. Bei der ersten Aktion das Ergebnis des Triggers. Nach einem If, Loop oder Parallel dessen eigenes Ergebnis. |
data |
Alles, was der Lauf bis hierher kennt, unter denselben Pfaden wie in {{…}}: data.InitialData, data.Trigger, data.FilePath, data.FileName, data.FileContent, in einer Loop data.item und data.index, in OnError data.Error, und jede Aktion unter ihrem Namen: data.KundeLaden.Response… |
console.log(…) |
Schreibt eine Zeile ins Protokoll (console.warn als Warnung, console.error als Fehler); Objekte erscheinen als JSON. |
Die Daten kommen als einfache JavaScript-Werte an: Objekte, Listen, Texte, Zahlen, true/false. Datumswerte sind Texte im Format 2026-11-04T08:30:00; mit new Date(…) wird daraus ein Datum.
Ergebnis
Abschnitt betitelt „Ergebnis“Gibt das Skript ein Objekt zurück, ist es die Response der Aktion:
return { count: 3, total: "1234.50" };"Response": { "count": 3, "total": "1234.50" }Die nächsten Aktionen lesen es als {{Summe.Response.count}}. Jeder andere Wert (Text, Zahl, Liste) steht in Response.Result, eine Liste also unter {{Summe.Response.Result}}, etwa als Items einer Loop. Ohne return ist Response leer.
Unter Meta.Logs stehen die Ausgaben von console.log (höchstens 200 Zeilen; alle stehen im Protokoll), unter Meta.DurationSeconds die Laufzeit.
Sprache und Grenzen
Abschnitt betitelt „Sprache und Grenzen“- JavaScript nach ES2023:
const/let, Pfeilfunktionen, Vorlagen-Texte mit`${…}`, Destrukturierung,?.und??,map/filter/reduce,JSON,Math,Date, reguläre Ausdrücke. - Das Skript läuft in RUNOS, ohne Zugriff auf Dateien, Netzwerk, Programme oder Windows.
require,import,fetchundsetTimeoutgibt es nicht. Für Dateien, Mails und APIs nehmen Sie die Aktionen davor oder danach. - Fehler: Wirft das Skript einen Fehler (
throw new Error("Kein Kunde gefunden")) oder enthält es einen Schreibfehler, schlägt die Aktion mit der Meldung und der Zeile fehl, z. B.Line 3: Kein Kunde gefunden. Danach gilt die Fehlerrichtlinie wie bei jeder Aktion. - Eine Endlosschleife endet nach
TimeoutSeconds, zu tiefe Rekursion (über 1000 verschachtelte Aufrufe) mit einer Fehlermeldung. Ein angehaltener Workflow bricht das Skript ebenfalls ab.
Beispiele
Abschnitt betitelt „Beispiele“Offene Rechnungen zählen und summieren
Abschnitt betitelt „Offene Rechnungen zählen und summieren“Eine HTTP-Anfrage RechnungenLaden liefert eine Liste; Code filtert die offenen und rechnet:
const items = data.RechnungenLaden.Response.Body.items;const offen = items.filter(r => r.status === "open");console.log(`${offen.length} von ${items.length} offen`);return { count: offen.length, total: offen.reduce((s, r) => s + r.amount, 0).toFixed(2), nummern: offen.map(r => r.number).join(", ")};Eine Mail danach schreibt: {{Summe.Response.count}} offene Rechnungen über {{Summe.Response.total}} €: {{Summe.Response.nummern}}.
Dateinamen zerlegen
Abschnitt betitelt „Dateinamen zerlegen“Beim File-Trigger mit Dateien wie 10042_RE-2026-117.pdf:
const [kunde, nummer] = data.FileName.replace(/\.pdf$/i, "").split("_");if (!nummer) throw new Error("Dateiname ohne Rechnungsnummer: " + data.FileName);return { kunde, nummer, jahr: nummer.split("-")[1] };Eine Liste für die Loop bauen
Abschnitt betitelt „Eine Liste für die Loop bauen“return input.Response.Body.contacts .filter(c => c.email) .map(c => ({ name: `${c.firstName} ${c.lastName}`, email: c.email.toLowerCase() }));Die Liste steht in {{Kontakte.Response.Result}}; eine Loop mit diesen Items sendet je Kontakt eine Mail an {{item.email}}.
