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êteCookiede la requête. Voir aussi Utilisation des cookies dans le Middleware.get- Une méthode qui prend unnomde cookie et renvoie un objet avecnameetvalue. Si aucun cookie avec cenomn'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. Sinomn'est pas spécifié, renvoie tous les cookies disponibles.set- Une méthode qui prend un objet avec les propriétés deCookieListItemtelles que définies dans la spécification W3C CookieStore API.delete- Une méthode qui prend unnomde cookie ou une liste de noms, et supprime les cookies correspondants. Renvoietruepour les cookies supprimés etfalsepour les non supprimés.has- Une méthode qui prend unnomde cookie et renvoie unbooleanselon 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,trailingSlasheti18n. Inclut les propriétés suivantes :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) - 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-Cookiede la réponse. Voir aussi Utilisation des cookies dans le Middleware.get- Une méthode qui prend unnomde cookie et renvoie un objet avecnameetvalue. Si aucun cookie avec cenomn'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. Sinomn'est pas spécifié, renvoie tous les cookies disponibles.set- Une méthode qui prend un objet avec les propriétés deCookieListItemtelles que définies dans la spécification W3C CookieStore API.delete- Une méthode qui prend unnomde cookie ou une liste de noms, et supprime les cookies correspondants. Renvoietruepour les cookies supprimés etfalsepour les non supprimés.
Méthodes statiques
Les méthodes statiques suivantes sont disponibles directement sur la classe NextResponse :
redirect()- Renvoie uneNextResponseavec une redirection configuréerewrite()- Renvoie uneNextResponseavec une réécriture configuréenext()- Renvoie uneNextResponsequi 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 connubrowsername: (string || undefined) Le nom du navigateurversion: (string || undefined) La version du navigateur, déterminée dynamiquement
devicemodel: (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, ouundefinedvendor: (string || undefined) Le fabricant de l'appareil, déterminé dynamiquement
enginename: (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,WebKitouundefinedversion: (string || undefined) La version du moteur de rendu, déterminée dynamiquement, ouundefined
osname: (string || undefined) Le nom du système d'exploitation, peut êtreundefinedversion: (string || undefined) La version du système d'exploitation, déterminée dynamiquement, ouundefined
cpuarchitecture: (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,sparc64ouundefined
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àGET307- 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 |