Best Practices
Bewährte Methoden und Muster für die professionelle Entwicklung mit LowCode. Dieser Abschnitt behandelt Flow-Organisation, Performance, Fehlerbehandlung, Sicherheit und Versionskontrolle.
Flow-Organisation
Namenskonventionen
Vergeben Sie immer aussagekräftige Namen:
Schlecht: function 1, http in 2, debug 3
Gut: validate order, POST /api/orders, log order errorsTab-Struktur
Organisieren Sie Ihre Flows in logische Tabs:
| Tab | Inhalt | Beispiel |
|---|---|---|
| APIs | REST-Endpunkte und HTTP-Handler | GET /api/orders, POST /api/users |
| Engine | Engine-Integrationen | Start-Process-Flows, UserTask-Handler |
| Dashboards | Dashboard-2 UI-Flows | Formulare, Tabellen, Charts |
| Utils | Hilfsfunktionen und Subflows | Logging, Validierung, Formatierung |
Subflows für Wiederverwendbarkeit
Lagern Sie wiederkehrende Logik in Subflows aus. Änderungen an einem Subflow wirken sich automatisch auf alle Instanzen aus.
Link Nodes für Lesbarkeit
Verwenden Sie Link-Nodes statt langer Verbindungen quer durch den Editor:
Flow 1: [http in] → [validate] → [link out: "process-order"]
Flow 2: [link in: "process-order"] → [save to db] → [send response]Comment Nodes für Dokumentation
Platzieren Sie Comment-Nodes am Anfang jedes Flows mit einer kurzen Beschreibung, dem Autor und dem Zweck des Flows.
Performance
Asynchrone Verarbeitung
Node-RED nutzt ein Single-Thread Event-Loop-Modell. Blockierende Operationen verhindern die Verarbeitung aller anderen Messages.
Nicht empfohlen — blockierende Schleife:
// Blockiert den gesamten Event-Loop
let result = 0;
for (let i = 0; i < 10000000; i++) {
result += Math.sqrt(i);
}
msg.payload = result;
return msg;Empfohlen — asynchrone Verarbeitung:
const result = await new Promise((resolve) => {
setImmediate(() => {
let sum = 0;
for (let i = 0; i < 10000000; i++) { sum += Math.sqrt(i); }
resolve(sum);
});
});
msg.payload = result;
return msg;Split/Join für parallele Verarbeitung
Nutzen Sie Split/Join-Nodes, um Arrays parallel zu verarbeiten:
[get 100 items] → [split] → [process item] → [join] → [send result]Caching mit Context
Vermeiden Sie wiederholte API-Aufrufe durch Caching im Flow-Context:
const cacheKey = "userList";
const cacheTTL = 60000; // 60 Sekunden
let cached = flow.get(cacheKey);
if (cached && (Date.now() - cached.timestamp) < cacheTTL) {
msg.payload = cached.data;
return msg;
}
// Kein Cache: API aufrufen (im nachfolgenden http-request Node)
return msg;Rate Limiting
Schützen Sie externe APIs mit der Delay-Node im Rate-Limit-Modus:
[trigger] → [delay: 10 msg/s] → [http request: external API]Fehlerbehandlung
Catch Nodes für jeden Flow
Jeder Flow sollte mindestens eine Catch-Node besitzen:
┌──> [log error] → [send alert]
[process data] ────┤
└──> [catch all] → [format error] → [http response: 500]Logging-Strategie
Nutzen Sie die Node-RED Log-API in Function Nodes:
node.trace("Detaillierte Debug-Informationen");
node.debug("Debug-Ausgabe für Entwicklung");
node.log("Allgemeine Information");
node.warn("Warnung: Aktion empfohlen");
node.error("Fehler aufgetreten", msg); // msg wird an Catch-Node gesendetRetry-Pattern
Implementieren Sie Wiederholungsversuche für unzuverlässige externe Dienste:
const maxRetries = 3;
const retryCount = msg.retryCount || 0;
if (msg.statusCode >= 500 && retryCount < maxRetries) {
msg.retryCount = retryCount + 1;
msg.delay = Math.pow(2, retryCount) * 1000; // Exponentielles Backoff
return [null, msg]; // Zweiter Ausgang zum Delay-Node
}
return [msg, null]; // Erster Ausgang: Erfolg oder Max erreichtCircuit Breaker
Verhindern Sie Kaskadenfehler bei ausgefallenen Diensten:
const state = flow.get("circuit_api") || { failures: 0, lastFail: 0 };
const resetTimeout = 30000;
if (state.failures >= 3 && (Date.now() - state.lastFail) < resetTimeout) {
msg.payload = { error: "Service vorübergehend nicht verfügbar" };
msg.statusCode = 503;
return [null, msg]; // Fehler-Ausgang
}
return [msg, null]; // Anfrage weiterleitenSicherheit
Credential Management
Niemals Zugangsdaten direkt in Flows hart kodieren:
// FALSCH
const apiKey = "sk-12345-geheim";
// RICHTIG: Umgebungsvariablen verwenden
const apiKey = env.get("EXTERNAL_API_KEY");Input-Validierung
Validieren Sie alle eingehenden Daten bei HTTP-Endpunkten:
const { name, email } = msg.payload;
if (!name || typeof name !== 'string' || name.length > 200) {
msg.statusCode = 400;
msg.payload = { error: "Ungültiger Name" };
return [null, msg];
}
return [msg, null];Authority-Integration
Nutzen Sie die Authority für Authentifizierung:
environment:
- NODERED_AUTH_ENABLED=true
- NODERED_OIDC_AUTHORITY_URL=http://authority:11560
- NODERED_OIDC_CLIENT_ID=lowcodeWeitere Details unter Authentication.
Versionskontrolle
Storage Extension mit YAML-Format
LowCode unterstützt die Speicherung von Flows im YAML-Format, das besser für Git geeignet ist als JSON:
environment:
- NODERED_FLOW_STORAGE_OUTPUT_FORMAT=yaml
- NODERED_FLOW_STORAGE_SAVE_BY_NODE=false| Einstellung | Wert | Beschreibung |
|---|---|---|
NODERED_FLOW_STORAGE_OUTPUT_FORMAT | yaml | Flows als YAML speichern |
NODERED_FLOW_STORAGE_SAVE_BY_NODE | false | Flows als Ganzes speichern |
Git-Workflow
- Feature-Branch erstellen:
git checkout -b feature/neue-api - Flows entwickeln und im Editor deployen
- Änderungen committen: Flows werden automatisch im YAML-Format gespeichert
- Pull Request erstellen und Review durchführen
- Merge und Deployment über den ArtifactShipper
Weiterführende Informationen
- Debugging — Fehleranalyse und Debugging-Werkzeuge
- Eigene Nodes — Custom Node-Entwicklung
- Konfiguration — Umgebungsvariablen und settings.js