NextRequest und NextResponse
next/server bietet server-exklusive Helfer für die Verwendung in Middleware und Edge-API-Routen.
NextRequest
Das NextRequest-Objekt erweitert die native Request-Schnittstelle mit folgenden zusätzlichen Methoden und Eigenschaften:
-
cookies- Eine RequestCookies-Instanz mit Cookies aus derRequest. Liest/verändert denCookie-Header der Anfrage. Siehe auch Verwendung von Cookies in Middleware.get- Eine Methode, die einen Cookie-nameentgegennimmt und ein Objekt mitnameundvaluezurückgibt. Falls kein Cookie mit demnamegefunden wird, gibt sieundefinedzurück. Bei mehreren passenden Cookies wird nur der erste Treffer zurückgegeben.getAll- Ähnlich wieget, gibt aber eine Liste aller Cookies mit passendemnamezurück. Wennnamenicht angegeben ist, werden alle verfügbaren Cookies zurückgegeben.set- Eine Methode, die ein Objekt mit Eigenschaften vonCookieListItemgemäß der W3C CookieStore API-Spezifikation entgegennimmt.delete- Eine Methode, die entweder einen Cookie-nameoder eine Liste von Namen entgegennimmt und die passenden Cookies entfernt. Gibttruefür gelöschte undfalsefür nicht gelöschte Cookies zurück.has- Eine Methode, die einen Cookie-nameentgegennimmt und einbooleanzurückgibt, je nachdem ob der Cookie existiert (true) oder nicht (false).clear- Eine Methode ohne Argumente, die effektiv denCookie-Header entfernt.
-
nextUrl: Enthält ein erweitertes, geparstes URL-Objekt mit Zugriff auf Next.js-spezifische Eigenschaften wiepathname,basePath,trailingSlashundi18n. Enthält folgende Eigenschaften:basePath(string)buildId(string || undefined)defaultLocale(string || undefined)domainLocaledefaultLocale: (string)domain: (string)http: (boolean || undefined)locales: (string[] || undefined)
locale(string || undefined)url(URL)
-
ip: (string || undefined) - Enthält die IP-Adresse derRequest. Diese Information wird von Ihrer Hosting-Plattform bereitgestellt. -
geo- Enthält die geografische Position derRequest. Diese Information wird von Ihrer Hosting-Plattform bereitgestellt. Enthält folgende Eigenschaften:city(string || undefined)country(string || undefined)region(string || undefined)latitude(string || undefined)longitude(string || undefined)
Sie können das NextRequest-Objekt als direkten Ersatz für die native Request-Schnittstelle verwenden, was Ihnen mehr Kontrolle über die Anfragebearbeitung gibt.
NextRequest kann aus next/server importiert werden:
import type { NextRequest } from 'next/server'NextFetchEvent
Das NextFetchEvent-Objekt erweitert das native FetchEvent-Objekt und enthält die waitUntil()-Methode.
Die waitUntil()-Methode kann verwendet werden, um die Ausführung der Funktion zu verlängern, falls Sie weitere Hintergrundarbeiten durchführen müssen.
import { NextResponse } from 'next/server'
import type { NextFetchEvent, NextRequest } from 'next/server'
export function middleware(req: NextRequest, event: NextFetchEvent) {
event.waitUntil(
fetch('https://my-analytics-platform.com', {
method: 'POST',
body: JSON.stringify({ pathname: req.nextUrl.pathname }),
})
)
return NextResponse.next()
}Das NextFetchEvent-Objekt kann aus next/server importiert werden:
import type { NextFetchEvent } from 'next/server'NextResponse
Die NextResponse-Klasse erweitert die native Response-Schnittstelle mit folgenden Elementen:
Öffentliche Methoden
Öffentliche Methoden sind auf einer Instanz der NextResponse-Klasse verfügbar. Je nach Anwendungsfall können Sie eine Instanz erstellen, einer Variable zuweisen und dann auf folgende öffentliche Methoden zugreifen:
cookies- Eine ResponseCookies-Instanz mit den Cookies aus derResponse. Liest/verändert denSet-Cookie-Header der Antwort. Siehe auch Verwendung von Cookies in Middleware.get- Eine Methode, die einen Cookie-nameentgegennimmt und ein Objekt mitnameundvaluezurückgibt. Falls kein Cookie mit demnamegefunden wird, gibt sieundefinedzurück. Bei mehreren passenden Cookies wird nur der erste Treffer zurückgegeben.getAll- Ähnlich wieget, gibt aber eine Liste aller Cookies mit passendemnamezurück. Wennnamenicht angegeben ist, werden alle verfügbaren Cookies zurückgegeben.set- Eine Methode, die ein Objekt mit Eigenschaften vonCookieListItemgemäß der W3C CookieStore API-Spezifikation entgegennimmt.delete- Eine Methode, die entweder einen Cookie-nameoder eine Liste von Namen entgegennimmt und die passenden Cookies entfernt. Gibttruefür gelöschte undfalsefür nicht gelöschte Cookies zurück.
Statische Methoden
Folgende statische Methoden sind direkt auf der NextResponse-Klasse verfügbar:
redirect()- Gibt eineNextResponsemit gesetzter Weiterleitung zurückrewrite()- Gibt eineNextResponsemit gesetzter Umschreibung zurücknext()- Gibt eineNextResponsezurück, die die Middleware-Kette fortsetzt
Um die oben genannten Methoden zu verwenden, müssen Sie das zurückgegebene NextResponse-Objekt zurückgeben. NextResponse kann aus next/server importiert werden:
import { NextResponse } from 'next/server'userAgent
Der userAgent-Helfer ermöglicht die Interaktion mit dem User-Agent-Objekt der Anfrage. Es ist vom nativen Request-Objekt abstrahiert und ein Opt-in-Feature. Es hat folgende Eigenschaften:
isBot: (boolean) Gibt an, ob die Anfrage von einem bekannten Bot stammtbrowsername: (string || undefined) Der Name des Browsersversion: (string || undefined) Die Version des Browsers, dynamisch bestimmt
devicemodel: (string || undefined) Das Modell des Geräts, dynamisch bestimmttype: (string || undefined) Der Typ des Browsers, kann einer der folgenden Werte sein:console,mobile,tablet,smarttv,wearable,embeddedoderundefinedvendor: (string || undefined) Der Hersteller des Geräts, dynamisch bestimmt
enginename: (string || undefined) Der Name der Browser-Engine, mögliche Werte:Amaya,Blink,EdgeHTML,Flow,Gecko,Goanna,iCab,KHTML,Links,Lynx,NetFront,NetSurf,Presto,Tasman,Trident,w3m,WebKitoderundefinedversion: (string || undefined) Die Version der Browser-Engine, dynamisch bestimmt, oderundefined
osname: (string || undefined) Der Name des Betriebssystems, kannundefinedseinversion: (string || undefined) Die Version des Betriebssystems, dynamisch bestimmt, oderundefined
cpuarchitecture: (string || undefined) Die Architektur der CPU, mögliche Werte:68k,amd64,arm,arm64,armhf,avr,ia32,ia64,irix,irix64,mips,mips64,pa-risc,ppc,sparc,sparc64oderundefined
userAgent kann aus next/server importiert werden:
import { userAgent } from 'next/server'import { NextRequest, NextResponse, userAgent } from 'next/server'
export function middleware(request: NextRequest) {
const url = request.nextUrl
const { device } = userAgent(request)
const viewport = device.type === 'mobile' ? 'mobile' : 'desktop'
url.searchParams.set('viewport', viewport)
return NextResponse.rewrite(url)
}FAQ
Warum verwendet redirect 307 und 308?
Bei der Verwendung von redirect() fällt auf, dass die Statuscodes 307 für eine temporäre Weiterleitung und 308 für eine permanente Weiterleitung verwendet werden. Traditionell wurde 302 für temporäre und 301 für permanente Weiterleitungen verwendet, jedoch haben viele Browser die Anfragemethode der Weiterleitung von POST zu GET geändert, wenn ein 302 verwendet wurde, unabhängig von der ursprünglichen Anfragemethode.
Nehmen wir das Beispiel einer Weiterleitung von /users zu /people: Wenn Sie eine POST-Anfrage an /users senden, um einen neuen Benutzer zu erstellen, und eine 302-temporäre Weiterleitung erfolgt, wird die Anfragemethode von POST zu GET geändert. Das ergibt keinen Sinn, da zum Erstellen eines neuen Benutzers eine POST-Anfrage an /people gesendet werden sollte, nicht eine GET-Anfrage.
Die Einführung des 307-Statuscodes bedeutet, dass die Anfragemethode als POST beibehalten wird.
302- Temporäre Weiterleitung, ändert die Anfragemethode vonPOSTzuGET307- Temporäre Weiterleitung, behält die Anfragemethode alsPOSTbei
Die redirect()-Methode verwendet standardmäßig 307 anstelle von 302 für temporäre Weiterleitungen, was bedeutet, dass Ihre Anfragen immer als POST-Anfragen beibehalten werden.
Wenn Sie eine GET-Antwort auf eine POST-Anfrage auslösen möchten, verwenden Sie 303.
Erfahren Sie mehr über HTTP-Weiterleitungen.
Wie greife ich auf Umgebungsvariablen zu?
process.env kann verwendet werden, um auf Umgebungsvariablen aus Edge-Middleware zuzugreifen. Sie werden während next build ausgewertet:
| Funktioniert | Funktioniert nicht |
|---|---|
console.log(process.env.MY_ENV_VARIABLE) | const getEnv = name => process.env[name] |
const { MY_ENV_VARIABLE } = process.env | |
const { "MY-ENV-VARIABLE": MY_ENV_VARIABLE } = process.env |