fix: Platzhalter-Keys nicht als echt werten + Crash-Schutz

- env.js: '…CHANGE-ME'-Platzhalter aus .env.example zählen als NICHT gesetzt.
  Vorher galt sk_test_CHANGE-ME als echter Stripe-Key → echter API-Call mit
  ungültigem Key → 401 → unhandledRejection → Server-Crash.
- billing.js: /checkout in try/catch → 502 statt Empty-Reply/Crash.
- index.js: globaler Express-Error-Handler + unhandledRejection-Guard, damit
  ein einzelner async-Fehler nie den ganzen Prozess killt.

E2E verifiziert (Mock): register→checkout→instance, idempotent (1 sub/1 inst),
401 bei falschem PW, Server lebt nach allen Requests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-05-30 15:49:47 +02:00
parent 6290475ea3
commit 4b96e1a6b0
3 changed files with 46 additions and 26 deletions
+11
View File
@@ -29,6 +29,17 @@ app.get("*", (req, res, next) => {
res.sendFile(path.join(dist, "index.html"), (err) => err && next());
});
// Express-Fehlerhandler: fängt synchron geworfene Fehler aus Routen → 500
// statt stiller Empty-Reply.
app.use((err, _req, res, _next) => {
console.error("Unbehandelter Routen-Fehler:", err);
if (!res.headersSent) res.status(500).json({ error: "Interner Fehler." });
});
// Letzte Verteidigungslinie: ein einzelner async-Fehler darf den Prozess nicht
// killen (im Dev-Test sonst "connection refused" für alle Folge-Requests).
process.on("unhandledRejection", (reason) => console.error("unhandledRejection:", reason));
app.listen(env.port, () => {
console.log(`RAPPORT-HOST API läuft auf :${env.port} (Base: ${env.publicBaseUrl})`);
});