Skip to content

NextRequest通过额外的便利方法扩展了Web Request API

cookies

读取或修改请求的Set-Cookie头部。

set(name, value)

给定一个名称,为请求设置一个具有给定值的cookie。

ts
// 给定传入请求 /home
// 设置一个cookie以隐藏横幅
// 请求将具有一个`Set-Cookie:show-banner=false;path=/home`头部
request.cookies.set('show-banner', 'false')

get(name)

给定一个cookie名称,返回cookie的值。如果找不到cookie,则返回undefined。如果找到多个cookie,则返回第一个。

ts
// 给定传入请求 /home
// { name: 'show-banner', value: 'false', Path: '/home' }
request.cookies.get('show-banner')

getAll()

给定一个cookie名称,返回cookie的值。如果没有给出名称,则返回请求上的所有cookie。

ts
// 给定传入请求 /home
// [
//   { name: 'experiments', value: 'new-pricing-page', Path: '/home' },
//   { name: 'experiments', value: 'winter-launch', Path: '/home' },
// ]
request.cookies.getAll('experiments')
// 或者,获取请求的所有cookie
request.cookies.getAll()

delete(name)

给定一个cookie名称,从请求中删除cookie。

ts
// 删除返回true,如果没有删除则返回false
request.cookies.delete('experiments')

has(name)

给定一个cookie名称,如果请求上存在cookie,则返回true

ts
// 如果存在cookie则返回true,否则返回false
request.cookies.has('experiments')

clear()

从请求中移除Set-Cookie头部。

ts
request.cookies.clear()

nextUrl

扩展了原生 URL API,增加了额外的便利方法,包括特定于 Next.js 的属性。

ts
// 给定请求到 /home,pathname 是 /home
request.nextUrl.pathname
// 给定请求到 /home?name=lee,searchParams 是 { 'name': 'lee' }
request.nextUrl.searchParams

以下是可用的选项:

## `ip`

ip 属性是一个字符串,包含了请求的 IP 地址。这个值可以由你的托管平台选择性提供。

须知:Vercel 上,这个值默认提供。在其他平台上,你可以使用 X-Forwarded-For 头部来提供 IP 地址。

ts
// Vercel 提供
request.ip
// 自托管
request.headers.get('X-Forwarded-For')

geo

geo 属性是一个对象,包含了请求的地理信息。这个值可以由你的托管平台选择性提供。

须知:Vercel 上,这个值默认提供。在其他平台上,你可以使用 X-Forwarded-For 头部来提供 IP 地址,然后使用 第三方服务 查询地理信息。

ts
// Vercel 提供
request.geo.city
request.geo.country
request.geo.region
request.geo.latitude
request.geo.longitude

// 自托管
function getGeo(request) {
  let ip = request.headers.get('X-Forwarded-For')
  // 使用第三方服务查询地理信息
}