EMZETT.
Login

Express und Node: Webserver und APIs mit JavaScript

Kurz: Express ist ein schlankes Webframework für Node.js: Routen beantworten HTTP-Anfragen, Middleware verarbeitet Anfragen schrittweise (Logging, JSON, Authentifizierung, Fehler).

Genauer: Mit Node.js läuft JavaScript auf dem Server. Express (seit 2010) ist der Klassiker für APIs und Webseiten; moderne Alternativen: Fastify, Hono, NestJS, Next.js Route Handlers.

Im Detail

Erste API

import express from 'express';
const app = express();
app.use(express.json());                    // JSON-Body lesen
 
const spiele = [{ id: 1, titel: 'Zelda' }];
 
app.get('/api/spiele', (req, res) => res.json(spiele));
 
app.get('/api/spiele/:id', (req, res) => {
  const s = spiele.find(x => x.id === Number(req.params.id));
  if (!s) return res.status(404).json({ fehler: 'nicht gefunden' });
  res.json(s);
});
 
app.post('/api/spiele', (req, res) => {
  const { titel } = req.body;
  if (typeof titel !== 'string' || !titel.trim()) return res.status(400).json({ fehler: 'titel fehlt' });
  const neu = { id: spiele.length + 1, titel: titel.trim() };
  spiele.push(neu);
  res.status(201).json(neu);
});
 
app.listen(3000, () => console.log('läuft auf :3000'));

Start: node server.js ("type": "module" in package.json). Express 5 unterstützt async-Handler mit automatischer Fehlerweitergabe.

Middleware und Fehler

Middleware sind Funktionen (req, res, next) in einer Kette: Reihenfolge zählt.

app.use((req, res, next) => { console.log(req.method, req.url); next(); });
app.use('/api', authPruefung);              // nur für /api
app.use((err, req, res, next) => {          // Fehler-Middleware (4 Parameter)
  console.error(err);
  res.status(500).json({ fehler: 'Serverfehler' });
});

Bewährte Pakete: helmet (Sicherheits-Header), cors, express-rate-limit, morgan/pino (Logging), zod (Validierung), cookie-parser/express-session, multer (Uploads).

Struktur und Datenbank

  • Router (express.Router()) pro Ressource, Controller/Service/Repository-Trennung.
  • Datenbank: pg/Drizzle/Prisma/Sequelize; Parameterisierte Abfragen.
  • Konfiguration: process.env (dotenv), nie Geheimnisse im Code.
  • Async/await + zentrale Fehlerbehandlung; Promises nicht unbehandelt lassen.
  • Tests: supertest + Jest/Vitest/node:test.
  • Betrieb: NODE_ENV=production, Prozessmanager (pm2) oder Docker, Reverse Proxy (Nginx) + HTTPS, Healthcheck, Logs.
  • Graceful Shutdown (SIGTERM).

Sicherheit und Einordnung

  • Eingaben validieren (Typ, Länge), kein eval, NoSQL-/SQL-Injection, XSS (nicht rohes HTML ausgeben), CSRF bei Cookie-Auth, CORS gezielt, Rate Limiting, Abhängigkeiten prüfen (npm audit).
  • Body-Größe begrenzen (express.json({ limit: '100kb' })).
  • Fehler nicht mit Stacktrace an Clients senden.
  • Vergleich: Express = minimal/viel Freiheit; Fastify schneller + Schemas; NestJS strukturiert (TypeScript, DI, Angular-Stil); Next.js vereint Frontend + API.
  • Lernpfad: Node-Grundlagen → HTTP/REST → Express → Datenbank → Auth → Tests → Deployment.

Siehe auch: Node.js, REST-API-Design, Rate Limiting