NextRequest y NextResponse
next/server
proporciona ayudantes exclusivos del servidor para usar en Middleware y Rutas API Edge.
NextRequest
El objeto NextRequest
es una extensión de la interfaz nativa Request
, con los siguientes métodos y propiedades añadidos:
-
cookies
- Una instancia de RequestCookies con las cookies de laRequest
. Lee/modifica la cabeceraCookie
de la solicitud. Consulte también Uso de cookies en Middleware.get
- Un método que toma unnombre
de cookie y devuelve un objeto conname
yvalue
. Si no se encuentra una cookie con esenombre
, devuelveundefined
. Si hay múltiples cookies coincidentes, solo devuelve la primera coincidencia.getAll
- Similar aget
, pero devuelve una lista de todas las cookies con unnombre
coincidente. Si no se especificanombre
, devuelve todas las cookies disponibles.set
- Un método que toma un objeto con propiedades deCookieListItem
como se define en la especificación W3C CookieStore API.delete
- Un método que toma unnombre
de cookie o una lista de nombres y elimina las cookies coincidentes. Devuelvetrue
para cookies eliminadas yfalse
para no eliminadas.has
- Un método que toma unnombre
de cookie y devuelve unboolean
indicando si la cookie existe (true
) o no (false
).clear
- Un método sin argumentos que elimina efectivamente la cabeceraCookie
.
-
nextUrl
: Incluye un objeto URL extendido y analizado que proporciona acceso a propiedades específicas de Next.js comopathname
,basePath
,trailingSlash
ei18n
. Incluye las siguientes propiedades: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
) - Contiene la dirección IP de laRequest
. Esta información es proporcionada por su plataforma de hosting. -
geo
- Contiene la ubicación geográfica de laRequest
. Esta información es proporcionada por su plataforma de hosting. Incluye las siguientes propiedades:city
(string || undefined
)country
(string || undefined
)region
(string || undefined
)latitude
(string || undefined
)longitude
(string || undefined
)
Puede usar el objeto NextRequest
como reemplazo directo de la interfaz nativa Request
, dándole más control sobre cómo manipular la solicitud.
NextRequest
se puede importar desde next/server
:
import type { NextRequest } from 'next/server'
NextFetchEvent
El objeto NextFetchEvent
extiende el objeto nativo FetchEvent
e incluye el método waitUntil()
.
El método waitUntil()
se puede usar para prolongar la ejecución de la función si tiene otro trabajo en segundo plano que realizar.
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()
}
El objeto NextFetchEvent
se puede importar desde next/server
:
import type { NextFetchEvent } from 'next/server'
NextResponse
La clase NextResponse
extiende la interfaz nativa Response
con lo siguiente:
Métodos públicos
Los métodos públicos están disponibles en una instancia de la clase NextResponse
. Dependiendo de su caso de uso, puede crear una instancia y asignarla a una variable, luego acceder a los siguientes métodos públicos:
cookies
- Una instancia de ResponseCookies con las cookies de laResponse
. Lee/modifica la cabeceraSet-Cookie
de la respuesta. Consulte también Uso de cookies en Middleware.get
- Un método que toma unnombre
de cookie y devuelve un objeto conname
yvalue
. Si no se encuentra una cookie con esenombre
, devuelveundefined
. Si hay múltiples cookies coincidentes, solo devuelve la primera coincidencia.getAll
- Similar aget
, pero devuelve una lista de todas las cookies con unnombre
coincidente. Si no se especificanombre
, devuelve todas las cookies disponibles.set
- Un método que toma un objeto con propiedades deCookieListItem
como se define en la especificación W3C CookieStore API.delete
- Un método que toma unnombre
de cookie o una lista de nombres y elimina las cookies coincidentes. Devuelvetrue
para cookies eliminadas yfalse
para no eliminadas.
Métodos estáticos
Los siguientes métodos estáticos están disponibles directamente en la clase NextResponse
:
redirect()
- Devuelve unaNextResponse
con una redirección configuradarewrite()
- Devuelve unaNextResponse
con una reescritura configuradanext()
- Devuelve unaNextResponse
que continuará la cadena de middleware
Para usar los métodos anteriores, debe devolver el objeto NextResponse
devuelto. NextResponse
se puede importar desde next/server
:
import { NextResponse } from 'next/server'
userAgent
El ayudante userAgent
le permite interactuar con el objeto user agent de la solicitud. Está abstraído del objeto nativo Request
y es una función opcional. Tiene las siguientes propiedades:
isBot
: (boolean
) Indica si la solicitud proviene de un bot conocidobrowser
name
: (string || undefined
) Nombre del navegadorversion
: (string || undefined
) Versión del navegador, determinada dinámicamente
device
model
: (string || undefined
) Modelo del dispositivo, determinado dinámicamentetype
: (string || undefined
) Tipo de navegador, puede ser uno de:console
,mobile
,tablet
,smarttv
,wearable
,embedded
, oundefined
vendor
: (string || undefined
) Fabricante del dispositivo, determinado dinámicamente
engine
name
: (string || undefined
) Nombre del motor del navegador, puede ser:Amaya
,Blink
,EdgeHTML
,Flow
,Gecko
,Goanna
,iCab
,KHTML
,Links
,Lynx
,NetFront
,NetSurf
,Presto
,Tasman
,Trident
,w3m
,WebKit
oundefined
version
: (string || undefined
) Versión del motor, determinada dinámicamente, oundefined
os
name
: (string || undefined
) Nombre del SO, puede serundefined
version
: (string || undefined
) Versión del SO, determinada dinámicamente, oundefined
cpu
architecture
: (string || undefined
) Arquitectura de la CPU, puede ser:68k
,amd64
,arm
,arm64
,armhf
,avr
,ia32
,ia64
,irix
,irix64
,mips
,mips64
,pa-risc
,ppc
,sparc
,sparc64
oundefined
userAgent
se puede importar desde 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)
}
Preguntas frecuentes
¿Por qué redirect
usa 307 y 308?
Al usar redirect()
puede notar que los códigos de estado utilizados son 307
para redirección temporal y 308
para redirección permanente. Tradicionalmente se usaba 302
para redirección temporal y 301
para permanente, pero muchos navegadores cambiaban el método de solicitud de la redirección, de POST
a GET
al usar 302
, independientemente del método original.
Tomando el ejemplo de una redirección de /users
a /people
, si hace una solicitud POST
a /users
para crear un nuevo usuario y se conforma con un 302
temporal, el método de solicitud cambiará de POST
a GET
. Esto no tiene sentido, ya que para crear un nuevo usuario debería hacer una solicitud POST
a /people
, no GET
.
La introducción del código de estado 307
significa que el método de solicitud se conserva como POST
.
302
- Redirección temporal, cambia el método de solicitud dePOST
aGET
307
- Redirección temporal, conserva el método de solicitud comoPOST
El método redirect()
usa 307
por defecto, en lugar de 302
, lo que significa que sus solicitudes siempre se conservarán como POST
.
Si desea causar una respuesta GET
a una solicitud POST
, use 303
.
Aprenda más sobre Redirecciones HTTP.
¿Cómo accedo a Variables de Entorno?
process.env
se puede usar para acceder a Variables de Entorno desde Edge Middleware. Se evalúan durante next build
:
Funciona | No funciona |
---|---|
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 |