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 cabeceraCookiede la solicitud. Consulte también Uso de cookies en Middleware.get- Un método que toma unnombrede cookie y devuelve un objeto connameyvalue. 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 unnombrecoincidente. Si no se especificanombre, devuelve todas las cookies disponibles.set- Un método que toma un objeto con propiedades deCookieListItemcomo se define en la especificación W3C CookieStore API.delete- Un método que toma unnombrede cookie o una lista de nombres y elimina las cookies coincidentes. Devuelvetruepara cookies eliminadas yfalsepara no eliminadas.has- Un método que toma unnombrede cookie y devuelve unbooleanindicando 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,trailingSlashei18n. Incluye las siguientes propiedades: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) - 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-Cookiede la respuesta. Consulte también Uso de cookies en Middleware.get- Un método que toma unnombrede cookie y devuelve un objeto connameyvalue. 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 unnombrecoincidente. Si no se especificanombre, devuelve todas las cookies disponibles.set- Un método que toma un objeto con propiedades deCookieListItemcomo se define en la especificación W3C CookieStore API.delete- Un método que toma unnombrede cookie o una lista de nombres y elimina las cookies coincidentes. Devuelvetruepara cookies eliminadas yfalsepara no eliminadas.
Métodos estáticos
Los siguientes métodos estáticos están disponibles directamente en la clase NextResponse:
redirect()- Devuelve unaNextResponsecon una redirección configuradarewrite()- Devuelve unaNextResponsecon una reescritura configuradanext()- Devuelve unaNextResponseque 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 conocidobrowsername: (string || undefined) Nombre del navegadorversion: (string || undefined) Versión del navegador, determinada dinámicamente
devicemodel: (string || undefined) Modelo del dispositivo, determinado dinámicamentetype: (string || undefined) Tipo de navegador, puede ser uno de:console,mobile,tablet,smarttv,wearable,embedded, oundefinedvendor: (string || undefined) Fabricante del dispositivo, determinado dinámicamente
enginename: (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,WebKitoundefinedversion: (string || undefined) Versión del motor, determinada dinámicamente, oundefined
osname: (string || undefined) Nombre del SO, puede serundefinedversion: (string || undefined) Versión del SO, determinada dinámicamente, oundefined
cpuarchitecture: (string || undefined) Arquitectura de la CPU, puede ser:68k,amd64,arm,arm64,armhf,avr,ia32,ia64,irix,irix64,mips,mips64,pa-risc,ppc,sparc,sparc64oundefined
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 dePOSTaGET307- 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 |