Files
DogFatherGitandClaude Opus 5 1c3b3808ba Express 5: geprueft, aber noch nicht umgestellt
Der Sprung 4 auf 5 entfernt Methoden, aendert die Pfadsyntax
grundlegend (path-to-regexp 8) und stellt Standardwerte um. Vieles
davon faellt nicht beim Start auf, sondern erst, wenn eine bestimmte
Adresse aufgerufen wird -- also im Betrieb, bei einem Kunden. Deshalb
zuerst pruefen statt installieren.

ZWEI PRUEFUNGEN, DIE SICH ERGAENZEN

pruef-express5.mjs durchsucht 89 Dateien nach den Bruchstellen aus dem
offiziellen Migrationsleitfaden: entfernte Aufrufe (res.send(zahl),
req.param, app.del, res.sendfile), die UMGEDREHTE Reihenfolge bei
res.redirect, geaenderte Pfadsyntax ("/*" ohne Namen, ":a?"),
schreibgeschuetztes req.query, entfernte static-Optionen.

server/test-express5.mjs startet einen echten Server mit genau unserem
Aufbau: Middleware-Kette mit eigenen Kopfzeilen, cookieParser,
express.json, eine umleitende Schranke, express.static, ein Router mit
Parameter, 404- und Fehlerbehandlung.

ERGEBNIS

15 von 15 Kategorien unbedenklich, 10 von 10 Laufpruefungen bestanden
gegen express 5.2.1. Der Umstieg waere ohne Codeaenderung moeglich.

Ein Fehlalarm lag dabei im Pruefer selbst: Er meldete drei
req.body-Zugriffe als ungesichert, die in Wahrheit innerhalb eines
"if (typeof req.body?.feld === 'boolean')" stehen -- der Rueckblick war
mit 60 Zeichen zu kurz fuer den Block. Ein Pruefer, der abgesicherte
Stellen anmahnt, kostet die Zeit, die er sparen soll, und beim
naechsten Mal glaubt man ihm auch die echten Funde nicht mehr.

NICHT UMGESTELLT

Bewusst. Der Bestand ist sicherheitstechnisch sauber (npm audit: 0),
express 4.22.2 wird weiter gepflegt, und der Nutzen waere gering
gegenueber dem Risiko, zwei laufende Dienste anzufassen. Die Vorarbeit
liegt vor -- wenn umgestellt wird, dann als eigener Vorgang mit
anschliessendem Live-Test, nicht nebenbei.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-26 20:19:25 +02:00

92 lines
3.7 KiB
JavaScript

/* =====================================================================
Verträglichkeitsprüfung Express 5
Aufruf: node test-express5.mjs (im Verzeichnis server)
Zwei Prüfungen ergänzen sich:
pruef-express5.mjs durchsucht den Bestand nach entfernten
Methoden und geänderter Pfadsyntax
diese Datei startet einen echten Server mit genau den
Bausteinen, die server/index.js und
server-internal/index.js verwenden
Das eine findet, was nicht mehr existiert. Das andere zeigt, ob der
Aufbau als GANZES noch läuft — eine Middleware-Kette kann aus lauter
gültigen Teilen bestehen und trotzdem anders reagieren.
Am 26.08.2026 gegen express 5.2.1 geprüft: 10 von 10 bestanden.
===================================================================== */
import express from "express";
import cookieParser from "cookie-parser";
import http from "http";
let ok = 0, fehl = 0;
const pruefe = (n, g, i) => { if (g) { ok++; console.log(" ok " + n + (i ? " -> " + i : "")); }
else { fehl++; console.log(" FEHL " + n + (i ? " -> " + i : "")); } };
const app = express();
app.set("trust proxy", 1);
app.disable("x-powered-by");
pruefe("app.set / app.disable", true);
/* Sicherheits-Kopfzeilen als Middleware — wie in server/index.js */
app.use((req, res, next) => { res.setHeader("X-Test", "1"); next(); });
app.use(cookieParser());
app.use(express.json({ limit: "1mb" }));
pruefe("Middleware-Kette (setHeader, cookieParser, json)", true);
/* Eine Schranke, die umleitet — wie webdesign-gate.js */
app.use("/gesperrt", (req, res) => res.redirect(302, "/zugang"));
/* Statische Auslieferung mit index — wie express.static(SITE_DIR) */
app.use("/statisch", express.static(process.cwd(), { index: false }));
app.get("/ping", (req, res) => res.status(200).json({ ok: true }));
app.post("/echo", (req, res) => res.status(201).json({ hat: !!req.body, feld: req.body?.a }));
/* Router, wie in routes/*.js */
const r = express.Router();
r.get("/inner/:id", (req, res) => res.json({ id: req.params.id }));
app.use("/r", r);
/* 404 und Fehlerbehandlung */
app.use((req, res) => res.status(404).json({ ok: false }));
app.use((err, req, res, next) => res.status(500).json({ ok: false, fehler: String(err.message) }));
const server = app.listen(4418);
await new Promise((f) => server.on("listening", f));
const hol = async (pfad, opt) => {
const a = await fetch("http://127.0.0.1:4418" + pfad, { redirect: "manual", ...opt });
let k = null; try { k = await a.json(); } catch {}
return { status: a.status, kopf: a.headers, koerper: k };
};
let a = await hol("/ping");
pruefe("GET mit res.status().json()", a.status === 200 && a.koerper?.ok === true, "HTTP " + a.status);
pruefe("eigene Kopfzeile kommt an", a.kopf.get("x-test") === "1");
pruefe("x-powered-by ist aus", !a.kopf.get("x-powered-by"));
a = await hol("/echo", { method: "POST", headers: { "content-type": "application/json" },
body: JSON.stringify({ a: "wert" }) });
pruefe("POST mit express.json()", a.status === 201 && a.koerper?.feld === "wert", JSON.stringify(a.koerper));
a = await hol("/r/inner/abc");
pruefe("Router mit Parameter", a.koerper?.id === "abc", JSON.stringify(a.koerper));
a = await hol("/gesperrt/irgendwas");
pruefe("res.redirect(302, ziel) — neue Reihenfolge",
a.status === 302 && a.kopf.get("location") === "/zugang",
a.status + " -> " + a.kopf.get("location"));
a = await hol("/gibtsnicht");
pruefe("404-Behandlung greift", a.status === 404);
a = await hol("/statisch/package.json");
pruefe("express.static liefert aus", a.status === 200);
server.close();
console.log(`\n===== ${ok} bestanden, ${fehl} fehlgeschlagen =====`);
process.exit(fehl ? 1 : 0);