NextRequest et NextResponse
next/server
fournit des utilitaires réservés au serveur pour une utilisation dans le Middleware et les routes API Edge.
NextRequest
L'objet NextRequest
est une extension de l'interface native Request
, avec les méthodes et propriétés supplémentaires suivantes :
-
cookies
- Une instance RequestCookies avec les cookies de laRequest
. Elle lit/modifie l'en-têteCookie
de la requête. Voir aussi Utilisation des cookies dans le Middleware.get
- Une méthode qui prend unnom
de cookie et renvoie un objet avecname
etvalue
. Si aucun cookie avec cenom
n'est trouvé, elle renvoieundefined
. Si plusieurs cookies correspondent, elle ne renvoie que le premier.getAll
- Similaire àget
, mais renvoie une liste de tous les cookies correspondant aunom
. Sinom
n'est pas spécifié, renvoie tous les cookies disponibles.set
- Une méthode qui prend un objet avec les propriétés deCookieListItem
telles que définies dans la spécification W3C CookieStore API.delete
- Une méthode qui prend unnom
de cookie ou une liste de noms, et supprime les cookies correspondants. Renvoietrue
pour les cookies supprimés etfalse
pour les non supprimés.has
- Une méthode qui prend unnom
de cookie et renvoie unboolean
selon que le cookie existe (true
) ou non (false
).clear
- Une méthode sans argument qui supprime effectivement l'en-têteCookie
.
-
nextUrl
: Inclut un objet URL étendu et analysé qui donne accès à des propriétés spécifiques à Next.js commepathname
,basePath
,trailingSlash
eti18n
. Inclut les propriétés suivantes :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
) - Contient l'adresse IP de laRequest
. Cette information est fournie par votre plateforme d'hébergement. -
geo
- Contient la localisation géographique de laRequest
. Cette information est fournie par votre plateforme d'hébergement. Inclut les propriétés suivantes :city
(string || undefined
)country
(string || undefined
)region
(string || undefined
)latitude
(string || undefined
)longitude
(string || undefined
)
Vous pouvez utiliser l'objet NextRequest
comme remplacement direct de l'interface native Request
, vous offrant plus de contrôle sur la manipulation de la requête.
NextRequest
peut être importé depuis next/server
:
import type { NextRequest } from 'next/server'
NextFetchEvent
L'objet NextFetchEvent
étend l'objet natif FetchEvent
et inclut la méthode waitUntil()
.
La méthode waitUntil()
peut être utilisée pour prolonger l'exécution de la fonction si vous avez d'autres tâches en arrière-plan à effectuer.
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()
}
L'objet NextFetchEvent
peut être importé depuis next/server
:
import type { NextFetchEvent } from 'next/server'
NextResponse
La classe NextResponse
étend l'interface native Response
, avec les éléments suivants :
Méthodes publiques
Les méthodes publiques sont disponibles sur une instance de la classe NextResponse
. Selon votre cas d'utilisation, vous pouvez créer une instance et l'assigner à une variable, puis accéder aux méthodes publiques suivantes :
cookies
- Une instance ResponseCookies avec les cookies de laResponse
. Elle lit/modifie l'en-têteSet-Cookie
de la réponse. Voir aussi Utilisation des cookies dans le Middleware.get
- Une méthode qui prend unnom
de cookie et renvoie un objet avecname
etvalue
. Si aucun cookie avec cenom
n'est trouvé, elle renvoieundefined
. Si plusieurs cookies correspondent, elle ne renvoie que le premier.getAll
- Similaire àget
, mais renvoie une liste de tous les cookies correspondant aunom
. Sinom
n'est pas spécifié, renvoie tous les cookies disponibles.set
- Une méthode qui prend un objet avec les propriétés deCookieListItem
telles que définies dans la spécification W3C CookieStore API.delete
- Une méthode qui prend unnom
de cookie ou une liste de noms, et supprime les cookies correspondants. Renvoietrue
pour les cookies supprimés etfalse
pour les non supprimés.
Méthodes statiques
Les méthodes statiques suivantes sont disponibles directement sur la classe NextResponse
:
redirect()
- Renvoie uneNextResponse
avec une redirection configuréerewrite()
- Renvoie uneNextResponse
avec une réécriture configuréenext()
- Renvoie uneNextResponse
qui continuera la chaîne de middleware
Pour utiliser les méthodes ci-dessus, vous devez renvoyer l'objet NextResponse
retourné. NextResponse
peut être importé depuis next/server
:
import { NextResponse } from 'next/server'
userAgent
L'utilitaire userAgent
vous permet d'interagir avec l'objet user agent de la requête. Il est abstrait de l'objet natif Request
et est une fonctionnalité optionnelle. Il possède les propriétés suivantes :
isBot
: (boolean
) Indique si la requête provient d'un bot connubrowser
name
: (string || undefined
) Le nom du navigateurversion
: (string || undefined
) La version du navigateur, déterminée dynamiquement
device
model
: (string || undefined
) Le modèle de l'appareil, déterminé dynamiquementtype
: (string || undefined
) Le type de navigateur, peut être l'une des valeurs suivantes :console
,mobile
,tablet
,smarttv
,wearable
,embedded
, ouundefined
vendor
: (string || undefined
) Le fabricant de l'appareil, déterminé dynamiquement
engine
name
: (string || undefined
) Le nom du moteur de rendu, peut être l'une des valeurs suivantes :Amaya
,Blink
,EdgeHTML
,Flow
,Gecko
,Goanna
,iCab
,KHTML
,Links
,Lynx
,NetFront
,NetSurf
,Presto
,Tasman
,Trident
,w3m
,WebKit
ouundefined
version
: (string || undefined
) La version du moteur de rendu, déterminée dynamiquement, ouundefined
os
name
: (string || undefined
) Le nom du système d'exploitation, peut êtreundefined
version
: (string || undefined
) La version du système d'exploitation, déterminée dynamiquement, ouundefined
cpu
architecture
: (string || undefined
) L'architecture du CPU, peut être l'une des valeurs suivantes :68k
,amd64
,arm
,arm64
,armhf
,avr
,ia32
,ia64
,irix
,irix64
,mips
,mips64
,pa-risc
,ppc
,sparc
,sparc64
ouundefined
userAgent
peut être importé depuis next/server
:
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
Pourquoi redirect
utilise-t-il 307 et 308 ?
Lors de l'utilisation de redirect()
, vous remarquerez peut-être que les codes d'état utilisés sont 307
pour une redirection temporaire et 308
pour une redirection permanente. Traditionnellement, un 302
était utilisé pour une redirection temporaire et un 301
pour une redirection permanente, mais de nombreux navigateurs ont modifié la méthode de requête de la redirection, passant d'une POST
à une GET
lors de l'utilisation d'un 302
, quelle que soit la méthode de requête d'origine.
Prenons l'exemple d'une redirection de /users
vers /people
: si vous effectuez une requête POST
vers /users
pour créer un nouvel utilisateur et que vous êtes confronté à une redirection temporaire 302
, la méthode de requête sera changée de POST
à GET
. Cela n'a pas de sens, car pour créer un nouvel utilisateur, vous devriez effectuer une requête POST
vers /people
, et non une GET
.
L'introduction du code d'état 307
signifie que la méthode de requête est préservée en tant que POST
.
302
- Redirection temporaire, changera la méthode de requête dePOST
àGET
307
- Redirection temporaire, préservera la méthode de requête en tant quePOST
La méthode redirect()
utilise par défaut un 307
au lieu d'une redirection temporaire 302
, ce qui signifie que vos requêtes seront toujours préservées en tant que requêtes POST
.
Si vous souhaitez provoquer une réponse GET
à une requête POST
, utilisez 303
.
En savoir plus sur les redirections HTTP.
Comment accéder aux variables d'environnement ?
process.env
peut être utilisé pour accéder aux variables d'environnement depuis le Middleware Edge. Elles sont évaluées lors de next build
:
Fonctionne | Ne fonctionne pas |
---|---|
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 |