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-name
entgegennimmt und ein Objekt mitname
undvalue
zurückgibt. Falls kein Cookie mit demname
gefunden wird, gibt sieundefined
zurück. Bei mehreren passenden Cookies wird nur der erste Treffer zurückgegeben.getAll
- Ähnlich wieget
, gibt aber eine Liste aller Cookies mit passendemname
zurück. Wennname
nicht angegeben ist, werden alle verfügbaren Cookies zurückgegeben.set
- Eine Methode, die ein Objekt mit Eigenschaften vonCookieListItem
gemäß der W3C CookieStore API-Spezifikation entgegennimmt.delete
- Eine Methode, die entweder einen Cookie-name
oder eine Liste von Namen entgegennimmt und die passenden Cookies entfernt. Gibttrue
für gelöschte undfalse
für nicht gelöschte Cookies zurück.has
- Eine Methode, die einen Cookie-name
entgegennimmt und einboolean
zurü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
,trailingSlash
undi18n
. Enthält folgende Eigenschaften:basePath
(string
)buildId
(string || undefined
)defaultLocale
(string || undefined
)domainLocale
defaultLocale
: (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-name
entgegennimmt und ein Objekt mitname
undvalue
zurückgibt. Falls kein Cookie mit demname
gefunden wird, gibt sieundefined
zurück. Bei mehreren passenden Cookies wird nur der erste Treffer zurückgegeben.getAll
- Ähnlich wieget
, gibt aber eine Liste aller Cookies mit passendemname
zurück. Wennname
nicht angegeben ist, werden alle verfügbaren Cookies zurückgegeben.set
- Eine Methode, die ein Objekt mit Eigenschaften vonCookieListItem
gemäß der W3C CookieStore API-Spezifikation entgegennimmt.delete
- Eine Methode, die entweder einen Cookie-name
oder eine Liste von Namen entgegennimmt und die passenden Cookies entfernt. Gibttrue
für gelöschte undfalse
für nicht gelöschte Cookies zurück.
Statische Methoden
Folgende statische Methoden sind direkt auf der NextResponse
-Klasse verfügbar:
redirect()
- Gibt eineNextResponse
mit gesetzter Weiterleitung zurückrewrite()
- Gibt eineNextResponse
mit gesetzter Umschreibung zurücknext()
- Gibt eineNextResponse
zurü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 stammtbrowser
name
: (string || undefined
) Der Name des Browsersversion
: (string || undefined
) Die Version des Browsers, dynamisch bestimmt
device
model
: (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
,embedded
oderundefined
vendor
: (string || undefined
) Der Hersteller des Geräts, dynamisch bestimmt
engine
name
: (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
,WebKit
oderundefined
version
: (string || undefined
) Die Version der Browser-Engine, dynamisch bestimmt, oderundefined
os
name
: (string || undefined
) Der Name des Betriebssystems, kannundefined
seinversion
: (string || undefined
) Die Version des Betriebssystems, dynamisch bestimmt, oderundefined
cpu
architecture
: (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
,sparc64
oderundefined
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 vonPOST
zuGET
307
- Temporäre Weiterleitung, behält die Anfragemethode alsPOST
bei
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 |