Startseite / Artikel / Express gegen Fastify im Jahr 2026: Ein praktischer Vergleich von Node.js-Frameworks

Express gegen Fastify im Jahr 2026: Ein praktischer Vergleich von Node.js-Frameworks

Dieser Leitfaden vergleicht Express und Fastify hinsichtlich Leistung, Validierung, Ökosystem sowie Fehlerbehandlung und behandelt außerdem die wichtigsten Änderungen in Express 5, die zu Inkompatibilitäten führen können.

2543 Wörter

Stellen Sie sich ein Team vor, das mit der Entwicklung eines neuen Node.js-Backends beginnt.

Sie fangen an, Frameworks zu recherchieren, und fast sofort dominieren zwei Namen die Diskussion:

Express.js und Fastify.

Dann tauchen die Benchmark-Diagramme auf.

In vielen synthetischen Tests weist Fastify deutlich höhere Durchsatzwerte auf.

Die natürliche Reaktion ist:

"Wenn Fastify bei der Geschwindigkeit gewinnt, warum sollte jemand weiterhin Express verwenden?"

Auf den ersten Blick ist das eine berechtigte Frage.

Doch die Wahl eines Backend-Frameworks hängt selten nur von einem einzigen Merkmal ab.

Die Anzahl der Rohanfragen pro Sekunde ist nur ein Teil des Gesamtbildes. Man muss auch das umgebende Ökosystem berücksichtigen, wie Middleware funktioniert, die integrierte Validierung, die Unterstützung für TypeScript, welche Kosten eine Migration mit sich bringen würde, die tägliche Entwicklererfahrung, jede bestehende Codebasis, die gepflegt werden muss, sowie was die konkrete Anwendung tatsächlich erfordert.

Es gibt noch eine zweite Ebene dieser Vergleich, die erwähnt werden sollte.

Express 5 ist jetzt offiziell verfügbar.

Nach langer Nutzung von Express 4 bringt diese neue Major-Version einige Änderungen mit sich, von denen alle, die eine ältere Express-Codebasis pflegen, wissen sollten.

Nun, da dieser Kontext geklärt ist, schauen wir uns genauer an, was Express wirklich von Fastify unterscheidet – und, noch nützlicher, in welchen Situationen jeweils eine Wahl sinnvoll ist.

Zuerst: Was sind Express und Fastify genau?

Sowohl Frameworks dienen dazu, Ihnen zu helfen, Webserver auf Basis von Node.js zu erstellen.

In ihrem Kern befreien sie Sie davon, direkt mit Node’s untergeordnetem HTTP-Modul zu arbeiten, indem sie eine sauberere API zur Definition von Routen und zum Verarbeiten von Anfragen bieten.

So sieht ein minimaler Express-Server aus:

const express = require("express");

const app = express();
app.get("/users", (req, res) => {
  res.json([
    { id: 1, name: "Neha" },
    { id: 2, name: "Rahul" }
  ]);
});
app.listen(3000);

Der Ausgangspunkt von Fastify sieht ziemlich ähnlich aus:

const fastify = require("fastify")({
  logger: true
});

fastify.get("/users", async (request, reply) => {
  return [
    { id: 1, name: "Neha" },
    { id: 2, name: "Rahul" }
  ];
});
fastify.listen({ port: 3000 });

Beachten Sie etwas?

Auch das eine Beispiel ist nicht besonders beängstigend.

Der eigentliche Unterschied zwischen den beiden wird erst dann deutlich, wenn Ihre Anwendung über diese spielerische Beispielstufe hinauswächst.

Express gegen Fastify: Der große Überblick

Lassen Sie uns betrachten, warum die Unterschiede zwischen diesen beiden Frameworks in der Praxis tatsächlich von Bedeutung sind.

1. Leistung: Fastify hat den Vorteil

Dies ist vermutlich der wichtigste Grund, warum Fastify in solchen Diskussionen immer wieder auftaucht.

Leistung und minimale Overhead-Kosten waren von Anfang an zentrale Entwurfsziele von Fastify.

Ihre Interna stützen sich stark auf Schemata zur Validierung eingehender Daten sowie zur Serialisierung ausgehender Antworten, was die Durchsatzleistung bei arbeitsintensiven API-Aufgaben erheblich steigern kann. Die eigene Dokumentation von Fastify empfiehlt ausdrücklich die Verwendung von JSON Schema für die Validierung von Routen sowie die Serialisierung von Antworten.

Doch es gibt hier eine wichtige Einschränkung.

Nehmen Sie nicht einfach ein einzelnes Benchmark-Ergebnis und kommen Sie direkt zu dem Schluss, dass:

Fastify bedeutet automatisch eine 3-mal schnellere Anwendung.

Die meisten Framework-Benchmarks messen die Overhead-Kosten des Frameworks selbst unter streng kontrollierten Bedingungen.

Die eigenen Wartungsteams von Fastify geben zu, dass ihr veröffentlichter Benchmark ein synthetischer „Hello World“-Typ-Test ist, und empfehlen ausdrücklich, Ihren eigenen echten Anwendungscode zu benchmarken, wenn Leistung für Sie von Priorität ist.

Betrachten Sie einen Anfragenfluss, der wie folgt aussieht:

Request
   ↓
Authentication
   ↓
Database query
   ↓
Redis
   ↓
External API
   ↓
Business logic
   ↓
Response

Falls bereits allein der Datenbankaufruf 80 Millisekunden dauert, wird das Weglassen eines kleinen Teils der Framework-Overhead die Geschwindigkeit dieses Endpunkts nicht wesentlich verbessern.

Daher ist die eigentliche Frage an Sie:

Ist meine Anwendung tatsächlich durch CPU-Beschränkungen oder Framework-Overhead gebremst?

Anders ausgedrückt: Ist das Framework selbst der Faktor, der die Anfragen verlangsamt? Wenn die Antwort ja lautet, gibt es einen viel stärkeren Grund, auf Fastify umzusteigen.

Falls die Antwort nein lautet, sollten allgemeine Framework-Benchmarks wahrscheinlich nicht Ihr Entscheidungskriterium sein.

2. Validierung: Hier wird Fastify interessant

Stellen Sie sich vor, Ihre API ist so konzipiert, dass sie einen Payload in dieser Form akzeptiert:

{
  "name": "Neha",
  "age": 25
}

Natürlich möchten Sie eine fehlerhafte Version desselben Payloads ablehnen, wie zum Beispiel:

{
  "name": 123,
  "age": "hello"
}

In der Welt von Express greifen Teams in der Regel auf eine zusätzliche Bibliothek zurück, um diese Art der Anfragevalidierung zu bewältigen. Fastify verfolgt einen anderen Ansatz: Die schema-basierte Validierung ist direkt im Framework selbst integriert.

So sieht das in der Praxis aus:

const schema = {
  body: {
    type: "object",
    required: ["name", "age"],
    properties: {
      name: { type: "string" },
      age: { type: "integer" }
    }
  }
};

fastify.post("/users", { schema }, async (request, reply) => {
  return { message: "User created" };
});

Fastify ermöglicht es Ihnen, JSON Schema-Definitionen für verschiedene Teile des Anfrage- und Antwortzyklus zu definieren, darunter:

  • den Anfragekörper
  • Abfragemethodenparameter
  • Routenparameter
  • Header
  • Die Serialisierung der Antwort

Im Hintergrund nutzt Fastify Ajv, um diese Validierungsstufe zu unterstützen, und dieselben Schema-Definitionen können auch dazu verwendet werden, die Serialisierung von Antworten zu beschleunigen.

Ajv, abgekürzt für „Another JSON Schema Validator“, ist eine schnelle, standardskonforme Bibliothek zur Validierung von JavaScript-Datenobjekten anhand von JSON Schema-Definitionen und funktioniert sowohl in Node.js als auch im Browser.

Der schema-basierte Ansatz wird besonders wertvoll, wenn Ihre API viele strukturierte Eingaben und Ausgaben verarbeiten muss.

3. Express hat etwas, das Fastify nicht so leicht ersetzen kann: sein Ökosystem

Express existiert seit 2010, was bedeutet, dass es um ihn herum eine enorme Menge an angesammeltem Wissen, Tools und Erfahrungen der Community gibt.

  • Brauchen Sie Authentifizierung? Es gibt ein passendes Paket dafür.
  • Brauchen Sie Logging? Es gibt ein passendes Paket dafür.
  • Brauchen Sie CORS-Verarbeitung? Es gibt ein passendes Paket dafür.
  • Brauchen Sie Validierung? Es gibt ein passendes Paket dafür.
  • Sitzen Sie fest wegen irgendeines seltenen Fehlers? Wahrscheinlich hat bereits jemand anderes damit zu kämpfen gehabt und eine Lösung dokumentiert.
  • Diese Tiefe des Ökosystems ist wichtiger, als es auf den ersten Blick scheinen mag.

    Stellen Sie sich vor, Sie treten in ein Unternehmen ein, dessen Backend bereits seit sechs Jahren in der Produktion läuft. Sie können das Framework nicht von Grund auf auswählen, sondern müssen das verwenden, was bereits vorhanden ist – es könnte etwa so aussehen:

    Express
     ├── 200+ routes
     ├── authentication middleware
     ├── custom middleware
     ├── logging
     ├── validation
     ├── monitoring
     └── lots of business logic
    

    Hätte es wirklich Sinn, all das neu zu schreiben, nur weil Fastify schneller ist? Wahrscheinlich nicht.

    Die Migration einer bestehenden Codebasis hat immer Kosten, und jede echte ingenieurtechnische Entscheidung muss diese Kosten mit dem erwarteten Nutzen abwägen.

    4. Middleware gegen Plugins

    Es gibt auch einen tieferen architektonischen Unterschied zwischen den beiden Frameworks.

    Express basiert auf dem Konzept des Middleware. Eine typische Einrichtung könnte wie folgt aussehen:

    app.use(authMiddleware);
    app.use(loggingMiddleware);
    app.use(express.json());
    

    Jeder eingehende Anfrage wird anschließend nacheinander durch diese Middleware-Funktionen geleitet.

    Fastify hingegen verwendet eine auf Plugins basierende Architektur, die auf Hooks und Encapsulation beruht. Konzeptionell sieht der Ablauf eher so aus:

    Request
       ↓
    Fastify
       ↓
    Hooks
       ↓
    Plugins
       ↓
    Route
       ↓
    Response
    

    Für Anwendungen, die von Anfang an nach Fastifys Modell entworfen werden, kann diese Struktur größere Codebasen einfacher organisieren und verstehen lassen.

    Doch es gibt einen Kompromiss: Wenn man jahrelang mentale Modelle rund um Express-ähnliches Middleware entwickelt hat, kann sich die Anpassung an Fastifys Plugin- und Hook-System zunächst ungewohnt anfühlen.

    5. Fehlerbehandlung

    In Express 4 erforderte die Behandlung von Fehlern aus asynchronen Route-Handlern in der Regel eine manuelle Weiterleitung derselben. Ein typisches Muster sah so aus:

    app.get("/user/:id", async (req, res, next) => {
      try {
        const user = await getUserById(req.params.id);
        res.json(user);
      } catch (error) {
        next(error);
      }
    });
    

    Express 5 vereinfacht dies erheblich. Nun werden Ablehnungen von Promises, die von Route-Handlern oder Middleware ausgelöst werden, automatisch an Ihre Fehlerbehandlungs-Middleware weitergeleitet, sodass Sie viel kompaktere Codestrukturen schreiben können:

    app.get("/user/:id", async (req, res) => {
      const user = await getUserById(req.params.id);
      res.json(user);
    });
    

    Falls getUserById() einen Fehler auslöst oder ablehnt, fängt Express 5 diesen automatisch ab und leitet ihn an Ihren Fehlerhandler weiter – es sind weder explizite try/catch-Anweisungen noch Aufrufe von next(err) erforderlich.

    Auf den ersten Blick erscheint dies als geringfügige syntaktische Erleichterung. Doch in einem Codebase mit Hunderten von Routen führt diese Art der kleinen Optimierungen zu deutlich übersichtlicherem und weniger fehleranfälligem Code.

    Express 5: Was hat sich tatsächlich geändert?

    Express 5 wurde im Oktober 2024 veröffentlicht, sodass es zum Beginn des Jahres 2026 keine neue Version mehr ist. Dennoch laufen viele Produktivanwendungen weiterhin unter Express 4, was bedeutet, dass es für alle, die einen Upgrade planen, von großer Bedeutung ist, zu verstehen, was sich zwischen den Versionen geändert hat.

    Und ja, es gibt brisante Änderungen, von denen man wissen muss.

    1. Optionale Route-Parameter wurden geändert

    In Express 4 könnte man eine Route wie folgt geschrieben haben:

    app.get("/:file.:ext?", handler);
    

    Express 5 ersetzt dieses Muster durch:

    app.get("/:file{.:ext}", handler);
    

    Die alte ?-Notation zur Kennzeichnung eines optionalen Parameters funktioniert nicht mehr.

    Warum der Wechsel?

    Die neue Syntax macht auf den ersten Blick klarer, welcher Teil des Pfads optional ist.

    Auf dem Papier handelt es sich um eine subtile Änderung, doch sie kann in einer großen, etablierten Anwendung heimlich Dutzende von Routen beeinträchtigen.

    2. Wildcard-Routen wurden geändert

    Zuvor könnte ein Allzweck-Route so aussehen:

    app.get("/*", handler);
    

    Express 5 erfordert, dass Wildcards benannt werden:

    app.get("/*splat", handler);
    

    Falls dieses Wildcard auch den Root-Pfad / abdecken soll, umschließen Sie es wie folgt:

    app.get("/{*splat}", handler);
    

    Das ist wieder ein kleiner Syntaxwechsel, der bei einem Upgrade stillschweigend die bestehende Routing-Logik stören kann.

    3. Änderungen bei den regulären Ausdruck-Route-Mustern

    Express 5 gibt die Unterstützung für mehrere alte, auf regex-ähnlichen Zeichen basierende String-Muster auf.

    Statt alternative Segmente direkt in einen einzigen Pfadstring einzubetten, geben Sie nun in der Regel ein Array von Pfaden an:

    app.get(
      ["/discussion/:slug", "/page/:slug"],
      handler
    );
    

    Der Zweck dieser Änderung ist es, die Route-Übereinstimmung explizit und vorhersehbar zu halten, anstatt auf regex-ähnlichen Abkürzungen zu setzen.

    4. req.body kann nun undefined sein

    Das ist ein subtiler Punkt, der leicht übersehen werden kann.

    In Express 4 war es üblich anzunehmen, dass:

    req.body
    

    selbst vor jeglicher Parsung auf ein leeres Objekt standardmäßig zurückgegriffen wird.

    In Express 5 kann req.body, wenn der Body nicht parsiert wird, einfach undefined sein.

    Das bedeutet, dass eine solche schützende Überprüfung je nach Route relevant wird:

    if (!req.body) {
      return res.status(400).send("Request body required");
    }
    

    Es handelt sich um eine geringfügige Verhaltensänderung, aber genau um diese kleinen Details kann es nach einem Upgrade zu schwer nachvollziehbaren Fehlern kommen.

    5. express.urlencoded() wurde geändert

    Der Standardwert für die Option extended ist nun false.

    Anstatt also vom impliziten Standardwert abhängig zu sein:

    app.use(express.urlencoded());
    

    sollten Sie ihn explizit setzen, wenn Ihre Anwendung auf das ältere Verhalten angewiesen ist:

    app.use(
      express.urlencoded({
        extended: true
      })
    );
    

    Noch ein Detail, das bei der Migration einer bestehenden Codebasis sorgfältig überprüft werden sollte.

    6. Änderungen am Body-Parser

    Express 5 hat außerdem die interne Funktionsweise des Body-Parsers überarbeitet.

    Nun können Sie Folgendes schreiben:

    app.use(express.json());
    app.use(
      express.urlencoded({
        extended: false
      })
    );
    

    anstelle dessen, wie zuvor separate Body-Parser-Middleware-Pakete zusammenzusetzen.

    Zusätzlich bietet Express 5 Unterstützung für Brotli-komprimierte Anfragenkörper und ermöglicht es, die maximale Tiefe für URL-kodierte Datenmengen einzustellen.

    7. Einige alte Response-APIs wurden entfernt

    Stellen Sie sich eine ältere Express-Anwendung vor, die etwas wie Folgendes enthält:

    res.send({
      message: "Success"
    }, 200);
    

    Unter Express 5 ist die erwartete Form wie folgt:

    res
      .status(200)
      .send({
        message: "Success"
      });
    

    Ebenso wurde der alte Shortcut:

    res.redirect("back");
    

    gänzlich entfernt.

    Der offizielle Migrationsleitfaden empfiehlt, den Referrer-Header manuell zu prüfen und bei dessen Fehlen auf einen Standardpfad zurückzugreifen.

    Niemand dieser einzelnen Änderungen ist besonders schwierig umzusetzen.

    Aber stellen Sie sich eine Codebasis mit Tausenden von Anrufen vor, die auf die alte Weise geschrieben wurden.

    In diesem Umfang wird ein Upgrade nicht mehr zu einer einfachen Anpassung von Abhängigkeiten, sondern zu einer eigenen umfangreichen ingenieurtechnischen Aufgabe.

    Also, Express oder Fastify: Welcher gewinnt?

    Zu diesem Zeitpunkt haben Sie genügend Kontext, um eine echte Entscheidung zu treffen.

    Ich würde sie nicht ausschließlich auf Folgendem basieren lassen:

    "Welcher ist in den Benchmarks schneller?"

    Schauen Sie sich stattdessen zunächst die Anwendung selbst an.

    Gründe, bei Express zu bleiben:

    • Sie beginnen gerade mit der Backend-Entwicklung in Node.js.
    • Ihr Team ist bereits mit Express vertraut.
  • Sie warten auf eine bestehende Express-Codebasis oder erweitern sie.
  • Ihr Projekt ist stark von Middleware im Express-Stil abhängig.
  • Sie möchten Zugang zum breitestmöglichen Ökosystem an Paketen haben.
  • Rohle Leistung ist nicht die Hauptbeschränkung, der Sie gegenüberstehen.
  • Sie bevorzugen etwas Einfaches und Flexibles gegenüber etwas Starrem.
  • Gründe, sich für Fastify zu interessieren:

    • Sie starten einen neuen, auf APIs ausgerichteten Service von Grund auf.
    • Durchsatz und die Minimierung der Framework-Overhead sind tatsächlich wichtig.
    • Sie möchten eine Validierung, die direkt durch Schemata gesteuert wird.
    • Sie möchten auch die Serialisierung über Schemata abwickeln lassen.
    • Sie entwickeln Microservices.
    • Ihnen gefällt die Arbeit mit einer plattformunabhängigen Architektur auf Basis von Plugins.
    • Ihnen macht es nichts aus, ein etwas jüngeres Ökosystem zu nutzen.

    Es ist an sich nichts Falsches daran, Express auch für ein großskaliges System zu wählen.

    Dass es sich um eine „große Anwendung“ handelt, bedeutet nicht automatisch, dass Fastify die richtige Wahl ist.

    Was das Framework umgibt – Ihre Gesamtarchitektur – ist in der Regel weitaus wichtiger als die Wahl des Frameworks selbst.

    Eine grundlegende Herangehensweise

    Hier ist ein grober Gedankengang zur Entscheidungsfindung:

    Start
                       │
                       ▼
              Is this an existing app?
                  /           \
                Yes            No
                 │              │
                 ▼              ▼
           Already using     Need very high
            Express?         throughput?
             /    \           /       \
           Yes     No       Yes        No
            │       │        │          │
            ▼       ▼        ▼          ▼
         Keep    Evaluate  Fastify    Evaluate
        Express  migration           both
    

    Bevor man sich auf eine endgültige Antwort festlegt, gibt es noch eine Frage, die gestellt werden sollte:

    Welches Problem versuche ich eigentlich zu lösen?

    Falls Ihre vorhandene Express-Anwendung langsam wirkt, widerstehen Sie dem Drang, sofort das Framework dafür verantwortlich zu machen.

    Analysieren Sie sie zunächst ausführlich.

    Der eigentliche Übeltäter könnte sein:

    Slow API
       ↓
    Database query
       ↓
    Missing index
    

    oder:

    Slow API
       ↓
    External API
       ↓
    3-second response time
    

    oder:

    Slow API
       ↓
    Expensive business logic
       ↓
    CPU bottleneck
    

    Das Wechseln des Frameworks löst diese zugrundeliegenden Probleme nicht von selbst.

    Meiene Einschätzung dazu

    Falls Sie heute ein neues kleines Node.js-Projekt starten würden, wäre es unsinnig, Express einfach nur deshalb zu ignorieren, weil Fastify bessere Benchmark-Werte aufweist. Express verfügt über ein umfangreiches Ökosystem, ein einfaches Konzeptmodell sowie jahrelange kollektive Erkenntnisse, die sich darum entwickelt haben.

    Trotzdem sollte Fastify auch nicht übersehen werden. Für einen neuen Dienst, bei dem Durchsatz, Schema-Validierung, Serialisierung sowie ein minimales Framework-Overhead tatsächlich von Bedeutung sind, verdient Fastify ernsthafte Berücksichtigung.

    Und falls Sie eine bestehende Express 4-Anwendung geerbt haben? Sie einfach nur deshalb umzuschreiben, weil Fastify schneller ist, wäre der falsche Ansatz.

    Der bessere Ansatz besteht darin, zunächst die Anwendung zu verstehen, herauszufinden, wo sich die tatsächlichen Engpässe befinden, die Kompatibilität mit Express 5 zu überprüfen, die Migrationstests durchzuführen und erst danach zu entscheiden, ob ein Wechsel der Frameworks genügend echten Nutzen bringt, um die Aufwand zu rechtfertigen.

    Das ist vermutlich die wichtigste Erkenntnis hier.

    Das Framework mit den besten Benchmarks ist nicht automatisch das richtige Framework für Ihre Situation.

    Das richtige Framework ist jenes, das Ihr tatsächliches Problem löst und dabei die geringste unnötige Komplexität hinzufügt.

    Verwandte Artikel