Zum Inhalt springen
noel.marketing

Astro

Effiziente Anfragenverarbeitung mit Astro

Noel

Geschrieben von Noel
Veröffentlicht:
19 Min. Lesezeit

Themen mit KI-Unterstützung recherchiert; von Noel vor der Veröffentlichung geprüft und überarbeitet.

Entwickler überprüft den Anfragefluss von Astro auf einem Laptop-Bildschirm

Thema vertiefen

Weitere Astro-Guides, Glossar-Einträge und Workflows findest du im Themen-Hub.

Astro-Middleware ist die Anfrageebene, die vor dem Abschluss des Renderns einer Seite oder eines Endpunkts ausgeführt wird. Sie ermöglicht es Ihnen, die eingehende Anfrage zu inspizieren, anfrage-spezifische Daten anzuhängen und zu entscheiden, ob Sie fortfahren, umleiten oder frühzeitig eine Antwort zurückgeben möchten.

Für Händler und Entwickler ist das wichtig, da es die Logik zentralisiert, die sonst über Seiten, Layouts oder API-Routen hinweg wiederholt werden müsste. Wenn eine Website konsistente Handhabung von Lokalen, Authentifizierungsprüfungen oder anfragebewussten Inhalten benötigt, ist Middleware der richtige Ort, um dies zu tun.

Wichtigste Erkenntnisse

  • Middleware ist besonders nützlich, wenn dieselbe Anfrage-Logik über viele Routen hinweg angewendet werden muss.
  • context.locals ist der gemeinsame Übergabepunkt zwischen Middleware, Seiten und API-Routen.
  • Middleware kann zur Build-Zeit für vorgerenderte Seiten und zur Anfragezeit für dynamische Seiten ausgeführt werden.
  • Umleitungen und frühe Antworten gehören in die Middleware, wenn Routing-Entscheidungen von Anfrage-Daten abhängen.
  • Typensichere Locals reduzieren Bugs, da die gemeinsam genutzten Anfragedaten vorhersehbar im gesamten App bleiben.

Was ist das?

Astro-Middleware ist eine Funktion, die eine Anfrage abfängt, bevor die endgültige Antwort erzeugt wird. Praktisch gesehen sitzt sie zwischen der eingehenden Anfrage und der gerenderten Seite und bietet einen Platz, um Logik auszuführen, die für eine Route oder eine Gruppe von Routen konsistent sein sollte.

Ein einfaches Beispiel ist ein Geschäft, das einen anderen Header anzeigen möchte, wenn ein Besucher angemeldet ist. Anstatt den Sitzungsstatus in jedem Seitenkomponenten zu überprüfen, kann die Middleware die Sitzung einmal lesen, ein Benutzerobjekt in context.locals speichern und diese Daten überall im Anfrage-Lebenszyklus verfügbar machen.

Der wichtige Teil ist, dass Middleware nicht nur für die Authentifizierung gedacht ist. Sie kann auch Anfragedaten normalisieren, Sprach- oder Regionswerte festlegen, gemeinsame Objekte für Vorlagen vorbereiten oder die Antwort ändern, bevor sie den Browser erreicht. Das macht sie zu einem kleinen, aber leistungsstarken Kontrollpunkt für Astro-Websites, die Inhaltsseiten, app-ähnliche Routen und API-Endpunkte mischen.

Ein nützliches mentales Modell ist folgendes: Komponenten rendern Inhalte, Routen definieren, wo Inhalte leben, und Middleware definiert, was mit der Anfrage geschehen soll, bevor das Rendering beginnt. Wenn überall dieselbe Entscheidung getroffen werden muss, ist Middleware in der Regel der sauberste Ort, um sie zu platzieren.

In Astro befindet sich die Middleware-Datei typischerweise in src/middleware.ts oder src/middleware.js und exportiert einen onRequest()-Handler. Dieser Handler erhält ein context-Objekt und eine next()-Funktion. Der Kontext gibt Ihnen Zugriff auf Anforderungsinformationen und ein locals-Objekt; next() setzt die Render-Pipeline fort. Wenn Sie Server-Hooks in anderen Frameworks verwendet haben, wird dies vertraut erscheinen, aber die Astro-Version ist absichtlich schlank und auf anfragebezogene Arbeiten fokussiert.

Warum ist es wichtig?

Middleware ist wichtig, weil sie Duplikationen reduziert und die Anfrage-Logik an einem Ort hält. Ohne sie neigen Teams dazu, dieselben Prüfungen über Layouts, Endpunkte und Seitenkomponenten hinweg zu verteilen, was die Wartung erschwert und die Wahrscheinlichkeit inkonsistenter Verhaltensweisen erhöht.

Aus geschäftlicher Sicht wirkt sich diese Konsistenz darauf aus, wie sicher Sie Inhalte personalisieren, den Zugriff beschränken oder das Verhalten der Seite anpassen können. Wenn eine Händler-Website einen angemeldeten Kunden benötigt, um kontospezifische Navigation zu sehen, oder eine regionsbewusste Verkaufsstelle benötigt, um die richtigen Voreinstellungen festzulegen, hilft die Middleware, diese Logik durchzusetzen, bevor die Seite zusammengestellt wird.

Aus technischer Sicht ist Middleware auch die richtige Schicht für anfrage-spezifische Daten, die nicht global zwischengespeichert werden sollten. Eine Benutzersitzung, ein Funktionsflag oder ein Gebietswert gehören zur aktuellen Anfrage und nicht zu einem gemeinsamen, app-weiten Speicher. context.locals gibt Ihnen eine strukturierte Möglichkeit, diese Daten weiterzugeben, ohne sie in Abfrageparametern zu verpacken oder Abrufe zu duplizieren.

Es verbessert auch die Klarheit. Wenn ein Entwickler die Middleware liest, kann er normalerweise erkennen, welche Querschnittsbelange in der App existieren: Authentifizierung, Umleitungen, Anreicherungen von Anfragen, Umleitungen oder Reaktionstransformationen. Das macht die Website einfacher zu verstehen, insbesondere wenn sie über eine einfache Broschüre hinauswächst.

Für Teams, die Handels- oder inhaltsintensive Erfahrungen bereitstellen, ist der Nutzen oft sowohl operativ als auch architektonisch. Eine einzige Middleware-Schicht kann Vorschau-Traffic von öffentlichem Traffic trennen, eine konsistente Lokalisierung sicherstellen oder sicherstellen, dass jede geschützte Route dieselben Sitzungsregeln überprüft. Das reduziert Randfall-Bugs, die schwer in isolierten Komponenten zu erkennen sind.

Es gibt auch einen Leistungsaspekt. Middleware kann unnötige Arbeiten verhindern, indem sie eine Anfrage frühzeitig stoppt, teure Datenladungen für öffentliche Routen überspringt oder Werte einmal normalisiert, anstatt die Parsing-Logik an mehreren Stellen zu wiederholen. Gut eingesetzt macht es den Anfragepfad einfacher, nicht schwerer.

Wie es funktioniert

Astro-Middleware funktioniert, indem sie einen onRequest()-Handler aus src/middleware.ts oder src/middleware.js exportiert. Dieser Handler erhält ein context-Objekt und eine next()-Funktion. Das context-Objekt trägt Anforderungsinformationen und ein locals-Objekt, während next() den Rendering-Prozess fortsetzt.

Der Ablauf ist unkompliziert. Zuerst betritt die Anfrage die Middleware. Dann kann Ihr Code Header, Cookies, Routendaten oder andere Kontextwerte inspizieren. Danach können Sie Daten an context.locals anhängen, sofort eine Antwort zurückgeben oder next() aufrufen, um zur Seite oder zum Endpunkt fortzufahren.

Wenn Sie next() aufrufen, setzt Astro das Rendern der Route fort. Alle Werte, die Sie in context.locals platziert haben, bleiben für spätere Teile der Anfrage verfügbar, einschließlich .astro-Dateien und API-Routen. Das ist der Grund, warum Locals so nützlich für anfragebezogene Daten sind: Sie werden für das aktuelle Rendering erstellt und verworfen, wenn diese Anfrage abgeschlossen ist.

Middleware kann auch das Ergebnis der Anfrage ändern. Zum Beispiel kann sie eine Anfrage an eine andere Route umleiten, ohne die URL im Browser zu ändern, oder sie kann eine benutzerdefinierte Antwort zurückgeben, bevor die Seite gerendert wird. Das macht es möglich, Zugriffssteuerungen, Anfrage-Normalisierungen oder HTML-Transformationen an einem einzigen Einstiegspunkt zu behandeln.

Der Anfragelebenszyklus in einfachen Worten

Betrachten Sie den Lebenszyklus als drei Schritte. Die Anfrage kommt an, die Middleware wird ausgeführt und die Route rendert oder verlässt frühzeitig. Wenn Sie Daten teilen müssen, platzieren Sie sie in context.locals. Wenn Sie die Anfrage stoppen müssen, geben Sie eine Antwort zurück. Wenn die Seite fortfahren soll, rufen Sie next() auf.

Dieses einfache Muster ist leicht zu erweitern. Eine Lokalisierungsschicht könnte den Accept-Language-Header inspizieren, context.locals.locale festlegen und dann die Seite mit dem richtigen Inhalt rendern lassen. Eine Authentifizierungsschicht könnte Cookies überprüfen und entweder context.locals.user setzen oder den Besucher zu einer Anmeldeseite umleiten.

Ein praktisches Detail, das es wert ist, erwähnt zu werden, ist, dass Middleware sowohl an der Build-Zeit als auch an der Anfrage-Zeit am Rendering teilnehmen kann. Das bedeutet, dass dasselbe Muster sowohl vorgerenderte Inhalte als auch dynamische Seiten unterstützen kann, aber die verfügbaren Anfragefunktionen unterschiedlich sind. Wenn Ihre Logik von Cookies, Headern oder anderen aktuellen Anfragedaten abhängt, stellen Sie sicher, dass die Route bei Bedarf gerendert wird. Wenn sie nur dazu dient, gemeinsame Daten für eine vorgerenderte Seite anzureichern, kann Middleware während des Builds dennoch nützlich sein.

Ein weiterer nützlicher Weg, um über den Mechanismus nachzudenken, ist als kleine Pipeline. Middleware kann lesen, anreichern, entscheiden und weitergeben. Lesen Sie die eingehende Anfrage einmal. Anreichern mit normalisierten Werten. Entscheiden, ob die Anfrage fortfahren soll. Das Ergebnis an die nächste Schicht weitergeben. Diese Pipeline hält die Anfragenverarbeitung vorhersehbar und erleichtert es, jeden Schritt separat zu testen.

Anwendungsfälle

Ein häufiger Anwendungsfall ist die anfragebewusste Personalisierung. Ein Händler möchte möglicherweise, dass der Header, die Preisnotizen oder die Kontolinks je nach Anmeldestatus eines Besuchers variieren. Middleware kann die Sitzung einmal laden und ein Benutzerobjekt für den Rest der Anfrage verfügbar machen, sodass die Seite den richtigen Zustand rendern kann, ohne zusätzliche Prüfungen in jeder Komponente.

Ein weiterer Anwendungsfall ist Lokalisierung und regionale Routenführung. Wenn eine Website mehrere Märkte bedient, kann die Middleware die Lokalisierung aus der Anfrage erkennen und in locals für nachgelagerte Komponenten speichern. Das ist besonders hilfreich, wenn dieselbe Seitenvorlage unterschiedliche Labels, Währungsangaben oder regionsspezifische Navigation basierend auf der aktuellen Anfrage rendern muss.

Ein dritter Anwendungsfall ist die Antwortkontrolle für app-ähnliche Abläufe. Middleware kann entscheiden, ob eine Anfrage fortgesetzt, umgeschrieben oder blockiert werden soll. Das ist nützlich für geschützte Seiten, Vorschauabläufe, Wartungsbildschirme oder jede Route, bei der das Ergebnis von Anfragedaten abhängt und nicht nur von statischen Inhalten.

In der Praxis überschneiden sich diese Anwendungsfälle oft. Eine Verkaufsstelle könnte Middleware verwenden, um die Sitzung zu lesen, die Lokalisierung festzulegen und zu entscheiden, ob ein Kunde eine umgeschriebene Kontoseite oder ein öffentliches Fallback sehen sollte. Der Wert liegt nicht nur in den einzelnen Prüfungen, sondern darin, sie in einer vorhersehbaren Schicht zu halten.

Es ist auch nützlich für Querschnittsbeobachtungen und die Gestaltung von Anfragen. Ein Team kann beispielsweise eine Anfrage-ID anhängen, einen Mieter- oder Marktcode normalisieren oder ein leichtes Analyse-Flag in locals vorbereiten, sodass nachgelagerter Code nicht dieselbe Parsing-Logik wiederholen muss. Das hält die Seitenkomponenten auf das Rendering fokussiert, anstatt auf die Interpretation der Anfrage.

Eine gute Faustregel ist, Middleware zu verwenden, wenn dieselbe Anfrageentscheidung mehrere Routen oder mehrere Schichten derselben Route betrifft. Vermeiden Sie es, sie für einmalige Inhaltsanpassungen zu verwenden, die nur innerhalb einer einzelnen Komponente von Bedeutung sind. Wenn die Logik nicht geteilt wird, ist die Middleware-Schicht in der Regel mehr Zeremonie als Wert.

Wie man es implementiert oder anwendet

Beginnen Sie mit der Erstellung von src/middleware.ts oder src/middleware.js und exportieren Sie onRequest(). Halten Sie den Handler zunächst klein. Eine gute erste Implementierung besteht normalerweise aus einer Sache: ein Anfragezeichen lesen, einen Wert in context.locals speichern und mit next() fortfahren.

Ein praktisches Muster besteht darin, die Daten, die Sie teilen möchten, zu definieren, bevor Sie die Seite rendern. Wenn Sie beispielsweise einen user, locale oder featureFlag benötigen, weisen Sie ihn in der Middleware context.locals zu und lesen Sie ihn später über Astro.locals in Ihren .astro-Dateien. Das hält den Anfragevertrag explizit.

Wenn Sie TypeScript verwenden, erweitern Sie den globalen App.Locals-Namespace in env.d.ts. Dies gibt Ihnen Autocomplete und hilft, Fehlanpassungen zwischen Middleware- und Seiten-Code zu verhindern. Es ist besonders wertvoll, wenn mehrere Entwickler dieselben Anfragedaten berühren, da die Typen dokumentieren, was verfügbar ist und welche Form es hat.

Wenn die Logik komplexer wird, überlegen Sie, ob sie in mehrere Middleware-Funktionen aufgeteilt und mit sequence() verkettet werden sollte. Das ist nützlich, wenn ein Anliegen die Anfrage validiert, ein anderes sie anreichert und ein drittes über die Antwort entscheidet. Verkettung hält jeden Schritt fokussiert, anstatt eine Datei in einen langen bedingten Block zu verwandeln.

Ein praktischer Implementierungsworkflow

  1. Identifizieren Sie die Anfragedaten, die Sie nachgelagert benötigen.
  2. Entscheiden Sie, ob die Daten in locals, eine Umleitung oder eine frühe Antwort gehören.
  3. Fügen Sie den Middleware-Handler hinzu und halten Sie die erste Version eng.
  4. Typisieren Sie App.Locals, wenn die Daten in mehreren Dateien geteilt werden.
  5. Testen Sie sowohl vorgerenderte als auch dynamische Routen, wenn Ihre App beide verwendet.

Eine gute Regel ist, Middleware für anfragebezogene Entscheidungen zu verwenden, nicht für langfristige Speicherung oder komplexe Geschäftslogik. Wenn die Daten über mehrere Besuche hinweg erhalten bleiben müssen, gehören sie in eine Datenbank, einen Sitzungspeicher oder ein anderes dauerhaftes System. Middleware sollte die Anfrage vorbereiten, nicht die Anwendungsschicht für den Status werden.

Bei der Anwendung von Middleware auf einen realen Workflow beginnen Sie mit dem kleinsten nützlichen Teil. Wenn Sie beispielsweise nur einen Lokalisierungswert benötigen, um einen Header und eine Produktnotiz zu rendern, fügen Sie nicht auch Logik für den Warenkorb, Preisregeln und Analysen im selben Handler hinzu. Getrennte Anliegen erleichtern es, den Anfragepfad zu testen und später ein Stück zu entfernen oder zu ersetzen.

Ein nützlicher Implementierungscheck ist zu fragen, was der nachgelagerte Code tatsächlich benötigt. Wenn eine Seite nur einen booleschen Wert wie isLoggedIn benötigt, geben Sie nicht das gesamte Sitzungsobjekt weiter, es sei denn, eine andere Route benötigt es wirklich. Kleinere Locals sind einfacher zu typisieren, einfacher zu inspizieren und weniger wahrscheinlich, unnötige Daten in Vorlagen zu leaken.

Sie können Middleware auch als Normalisierungsschicht verwenden. Wenn verschiedene Teile der App denselben Markt unter verschiedenen Codes oder Schreibweisen ansprechen, kann Middleware diese Eingaben in einen kanonischen Wert umwandeln, bevor etwas anderes darauf zugreift. Diese Art der Bereinigung ist subtil, verhindert jedoch viele bedingte Verzweigungen später.

Bei der Entscheidung zwischen Middleware und Seitenlogik stellen Sie zwei Fragen: Muss der Wert in mehr als einer nachgelagerten Datei verfügbar sein, und hängt er von der aktuellen Anfrage ab? Wenn beide Antworten ja sind, ist Middleware eine starke Wahl. Wenn die Antwort auf eine der Fragen nein ist, halten Sie die Logik näher an der Komponente oder Route, die sie tatsächlich benötigt.

Häufige Fehler und Fallstricke

Der häufigste Fehler besteht darin, Middleware übermäßig für Logik zu verwenden, die woanders hingehört. Wenn ein Wert statisch ist und sich je Anfrage nie ändert, muss er nicht in der Middleware geladen werden. Zu viel dort zu platzieren, kann den Anfragepfad schwerer debugbar und langsamer nachvollziehbar machen.

Ein weiterer Fallstrick besteht darin, anzunehmen, dass locals persistent ist. Das ist es nicht. context.locals existiert nur für die aktuelle Anfrage, sodass es der falsche Ort für Daten ist, die über mehrere Besuche oder Sitzungen hinweg überdauern müssen. Wenn die App einen dauerhaften Status benötigt, speichern Sie ihn an einem Ort, der dafür vorgesehen ist.

Teams geraten auch in Schwierigkeiten, wenn sie vergessen, gemeinsame Locals zu typisieren. Ohne ein deklariertes App.Locals-Interface ist es leicht, dass eine Datei annimmt, dass eine Eigenschaft existiert, während eine andere Datei eine andere Form oder einen anderen Namen setzt. Typensicherheit ist hier wichtig, da Middleware oft die verborgene Abhängigkeit hinter mehreren Seiten ist.

Ein weiteres Problem besteht darin, Umleitungen, Umleitungen und Antwortersetzungen zu verwechseln. Eine Umleitung ändert den Inhalt, der bereitgestellt wird, ohne die Browser-URL zu ändern, während eine Umleitung den Besucher woanders hin sendet. Wenn Sie eine andere URL benötigen, verwenden Sie eine Umleitung; wenn Sie unterschiedlichen Inhalt hinter derselben URL benötigen, ist Middleware plus Umleitung die bessere Wahl.

Es gibt auch einen Leistungsfallstrick: teure Arbeiten für jede Anfrage zu leisten, wenn nur eine kleine Teilmenge von Routen sie benötigt. Wenn die Authentifizierung nur im Konto-Bereich von Bedeutung ist, schränken Sie die Middleware ein oder verzweigen Sie frühzeitig, sodass öffentliche Seiten nicht für unnötige Prüfungen bezahlen. Vermeiden Sie es auch, locals mit großen Objekten zu mutieren, wenn ein kleiner normalisierter Wert ausreicht.

Ein weiterer subtiler Fehler besteht darin, die Middleware zu einer zweiten Anwendungsschicht werden zu lassen. Wenn der Handler damit beginnt, mehrere Dienste abzurufen, große Payloads zu transformieren und mehrere verzweigte Entscheidungen zu treffen, kann es schwieriger werden, sie zu testen als die Seiten, die sie unterstützen. In diesem Fall sollten Sie wiederverwendbare Geschäftslogik in eine separate Serverdienstprogramm verschieben und die Middleware als Orchestrierungsschicht behalten.

Eine weitere praktische Falle besteht darin, die Build-Zeit-Rendervorgänge nicht zu berücksichtigen. Wenn eine Route vorgerendert wird, kann die Middleware ausgeführt werden, ohne dieselben aktuellen Anforderungsfunktionen zu haben, die Sie von einer dynamischen Seite erwarten würden. Das bedeutet, dass Code, der auf Cookies oder Headern basiert, sorgfältig geschrieben und im Rendering-Modus getestet werden sollte, den die Route tatsächlich verwendet.

Best Practices und schnelle Checkliste

Halten Sie die Middleware auf anfragerelevante Anliegen fokussiert, die geteilt oder frühzeitig durchgesetzt werden müssen. Wenn die Logik nicht von der Anfrage abhängt, gehört sie wahrscheinlich nicht dorthin. Diese Disziplin hält die Middleware klein und leichter testbar.

Verwenden Sie context.locals als Übergabepunkt zwischen Anfrage-Logik und Rendering. Benennen Sie Werte klar, halten Sie ihre Form stabil und dokumentieren Sie sie mit TypeScript, wenn möglich. Je vorhersehbarer Locals sind, desto weniger defensiven Code benötigen Sie in Seiten und Endpunkten.

Bevorzugen Sie Verkettungen, wenn Sie unterschiedliche Anliegen haben. Authentifizierung, Lokalisierung und Antwortgestaltung können jeweils in ihrer eigenen Middleware-Funktion leben, was den Ablauf einfacher zu lesen macht als einen großen bedingten Block. Diese Trennung hilft auch, wenn ein Schritt später wiederverwendet oder umgeordnet werden muss.

Eine praktische Checkliste kann die Implementierung ehrlich halten: Bestätigen Sie, dass die Route wirklich anfragezeitliche Logik benötigt, bestätigen Sie, dass die Daten anfragebezogen sind, bestätigen Sie, dass die nachgelagerten Dateien die Struktur der Locals kennen, und bestätigen Sie, dass die gewählte Aktion korrekt für die Benutzererfahrung ist. Wenn eine dieser Antworten unklar ist, muss die Middleware wahrscheinlich vereinfacht werden.

Schnelle Checkliste:

  • Speichern Sie nur anfragebezogene Daten in Locals.
  • Typisieren Sie gemeinsame Locals in env.d.ts.
  • Verwenden Sie next(), wenn die Anfrage fortgesetzt werden soll.
  • Verwenden Sie eine Umleitung, wenn sich der Inhalt ändern soll, ohne die URL zu ändern.
  • Testen Sie sowohl vorgerenderte als auch dynamische Routen.
  • Halten Sie die Middleware klein genug, um auf einen Blick verstanden zu werden.
  • Verzweigen Sie frühzeitig, damit öffentliche Routen teure Arbeiten überspringen.
  • Bevorzugen Sie einfache Werte in Locals, es sei denn, der nachgelagerte Code benötigt wirklich ein komplexeres Objekt.
  • Trennen Sie die Anfragenorchestrierung von wiederverwendbarer Geschäftslogik.
  • Überprüfen Sie, ob jeglicher cookie- oder headerbasierte Code mit dem Rendering-Modus der Route übereinstimmt.

Wenn Sie entscheiden, ob Sie Middleware überhaupt hinzufügen möchten, stellen Sie eine Frage: Muss diese Logik vor jeder passenden Anfrage ausgeführt werden und für mehrere nachgelagerte Dateien sichtbar sein? Wenn die Antwort ja ist, ist Middleware wahrscheinlich die richtige Schicht.

Aus der Praxis — Illustratives Szenario (hypothetisch, kein Kundenprojekt)

Illustratives Beispiel — kein reales Kundenprojekt: Stellen Sie sich einen Händler vor, der eine inhaltsreiche Astro-Website mit einem kleinen Kundenbereich betreibt. Die öffentlichen Seiten sind vorgerendert, aber der Kontobereich wird auf Abruf gerendert, da er von Sitzungsdaten abhängt. Das Team möchte, dass der Header einen angemeldeten Status anzeigt, die Kontoseite die Lokalisierung des Besuchers kennt und bestimmte Routen blockiert werden, es sei denn, es existiert eine Sitzung.

Ein typisches Setup würde mit Middleware beginnen, die Cookies liest, überprüft, ob eine Sitzung vorhanden ist, und ein minimales Benutzerobjekt sowie die Lokalisierung in context.locals speichert. Öffentliche Seiten können diese Daten ignorieren, aber Kontoseiten und gemeinsame Layoutkomponenten können über Astro.locals darauf zugreifen und die korrekte Navigation oder Kopie rendern.

Das erste Problem, das das Team möglicherweise bemerkt, ist die Duplizierung. Ohne Middleware müsste jede Seite ihre eigene Sitzungsabfrage und Lokalisierungsanalyse durchführen. Das führt zu wiederholtem Code und erhöht die Wahrscheinlichkeit, dass eine Seite sich anders verhält als eine andere. Middleware löst das, indem sie die Anfragedaten einmal, an einem Ort verfügbar macht.

Die nächste Entscheidung besteht darin, was zu tun ist, wenn die Sitzung fehlt. Wenn die Route geschützt ist, kann die Middleware die Anfrage zu einer Anmeldeseite umleiten oder frühzeitig eine Antwort zurückgeben. Wenn die Route öffentlich, aber personalisiert ist, kann sie einfach fortfahren und die Seite mit einem Fallback-Zustand rendern lassen. Diese Unterscheidung ist wichtig, da nicht jede Anfrage denselben Durchsetzungsgrad benötigt.

Ein sinnvoller Workflow für das Team wäre es, die Routen in drei Gruppen zu unterteilen: öffentlich, personalisiert und geschützt. Öffentliche Routen überspringen die meiste Middleware-Arbeit. Personalisierte Routen reichern Locals an, fahren aber fort. Geschützte Routen validieren zuerst den Zugriff und rendern dann. Diese Struktur hält die Logik verständlich und verhindert, dass jede Seite dieselben Kosten trägt.

Das Team möchte auch den Vertrag der Locals im Voraus definieren. Zum Beispiel könnte user nullierbar sein, locale könnte immer ein kurzer String sein, und isPreview könnte ein Boolean sein. Sobald diese Strukturen typisiert sind, können die Seitenautoren sich auf sie verlassen, ohne raten zu müssen, ob eine Eigenschaft existiert.

Wenn das Team später ein zweites Anliegen hinzufügt, wie ein Funktionsflag für ein neues Kontodashboard, können sie einen weiteren Middleware-Schritt verkettet hinzufügen, anstatt den ersten Schritt endlos auszubauen. Ein Schritt kann die Sitzung validieren, ein anderer kann das Flag setzen, und ein dritter kann entscheiden, ob zu einer Beta-Route umgeleitet werden soll. Das hält jedes Anliegen sichtbar und einfacher zu entfernen, falls sich der Rollout ändert.

Die Erkenntnis ist nicht, dass Middleware die gesamte Seitenlogik ersetzt. Es ist, dass Middleware der App eine saubere Grenze für anfragebewusste Entscheidungen gibt. Sobald das Team diese Grenze versteht, wird der Rest des Codes einfacher zu strukturieren: Seiten rendern Inhalte, Locals tragen gemeinsam genutzte Anfragedaten, und Middleware behandelt die Entscheidungen, die zuerst getroffen werden müssen.

Verwandte Konzepte und weiterführende Literatur

Middleware ist am einfachsten zu verwenden, wenn Sie bereits verstehen, wie Astro Daten teilt und Routen rendert. Diese verwandten Leitfäden behandeln die Teile, die normalerweise neben ihr in einem echten Projekt stehen.

  • Astro Inhaltskollektionen — nützlich, wenn Middleware anfragebewusste Daten in strukturierte Inhalte einspeist.
  • Astro Islands Architektur — hilfreich, um zu entscheiden, was statisch bleiben und was auf Anfragen reagieren sollte.
  • Astro-Themen — stöbern Sie in Astro-bereiten Seitenfundamenten, wenn Sie Middleware-Muster in einem echten Projekt anwenden möchten.
  • Astro View Transitions — relevant, wenn Anfragenbearbeitung und Navigationsverhalten zusammenarbeiten müssen.
  • Astro-Dokumentation zur Middleware — das offizielle Referenzdokument für Kontext, Locals, Verkettung und Umleitungen.

Thema vertiefen

Weitere Astro-Guides, Glossar-Einträge und Workflows findest du im Themen-Hub.

Häufige Fragen

Was macht die Astro-Middleware?

Astro-Middleware fängt eine Anfrage ab, bevor eine Seite oder ein Endpunkt das Rendern abschließt. Das gibt Ihnen einen Platz, um Anfragedaten zu lesen, gemeinsame Werte in Locals festzulegen, die Route umzuleiten oder frühzeitig eine Antwort zurückzugeben.

Wann sollte ich Locals in Astro-Middleware verwenden?

Verwenden Sie Locals, wenn anfrage-spezifische Daten später im selben Renderzyklus verfügbar sein müssen. Häufige Beispiele sind ein Benutzerobjekt, ein Funktionsflag oder ein Gebietswert.

Kann die Astro-Middleware auf vorgerenderten Seiten ausgeführt werden?

Ja, Middleware kann auch zur Build-Zeit für vorgerenderte Seiten ausgeführt werden, jedoch ist der Anfragekontext anders als beim dynamischen Rendering.

Wie typisiere ich Astro.locals?

Astro empfiehlt, den globalen App.Locals-Namespace in Ihrer env.d.ts-Datei zu erweitern. Das gibt Ihnen Autocomplete und Typensicherheit in sowohl Middleware als auch .astro-Dateien.

Was ist der Unterschied zwischen Middleware und Umleitungen in Astro?

Middleware ist der Ort, an dem entschieden wird, was mit einer Anfrage geschehen soll, während eine Umleitung eine mögliche Handlung ist, die Sie von dieser Schicht aus vornehmen können.

Ersetzt die Astro-Middleware die Seitenlogik?

Nein. Middleware ist am besten für anfragebezogene Anliegen geeignet, die vor dem Rendering geteilt oder durchgesetzt werden müssen.

Weiterlesen

  1. 1Astro Prefetch für schnellere Navigation

    Astro Prefetch kann die Navigation sofort erscheinen lassen, indem die nächste Seite vor einem Klick geladen wird. Dieser Leitfaden erklärt die Strategien, Abwägungen und Implementierungsentscheidungen.

  2. 2Astro-Inhaltskollektionen: Die praktische Methode zur strukturierten Inhaltsverwaltung

    Astro-Inhaltskollektionen bieten Teams eine strukturierte Möglichkeit, Markdown, MDX, JSON und YAML-Inhalte mit Validierung und Typensicherheit zu verwalten. Dieser Leitfaden erklärt, wie sie funktionieren und wann sie verwendet werden sollten.

  3. 3Astro SSR und hybrides Rendern

    Das hybride Rendern mit Astro SSR ermöglicht es, statische und servergerenderte Seiten in einem Projekt zu kombinieren. Nutze es, wenn einige Routen frische, personalisierte oder anforderungsbezogene Inhalte benötigen, ohne die statische Leistung anderswo aufzugeben.

  4. 4Astro Server Islands für SEO

    Ein praktischer Leitfaden zu Astro Server Islands für Händler und Entwickler, die schnellere Seiten ohne Verzicht auf dynamische Inhalte wünschen. Erfahren Sie, wo sie SEO unterstützen, wie sie funktionieren und was zu vermeiden ist.

  5. 5Astro MDX für strukturierten Inhalt

    Astro MDX ermöglicht es Teams, Markdown mit Komponenten zu kombinieren, sodass der Inhalt strukturiert bleibt, ohne die Kontrolle über das Layout aufzugeben. Dieser Leitfaden behandelt, wie es funktioniert und wie man es effektiv nutzt.