/* ===================================================================== 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);