路由处理程序
路由处理程序允许您使用 Web Request 和 Response API 为给定路由创建自定义请求处理程序。
需知:路由处理程序仅在
app
目录内可用。它们等效于pages
目录内的 API 路由,这意味着您不需要同时使用 API 路由和路由处理程序。
约定
路由处理程序在 app
目录内的 route.js|ts
文件 中定义。
export async function GET(request: Request) {}
路由处理程序可以嵌套在 app
目录内的任何位置,类似于 page.js
和 layout.js
。但是,在与 page.js
相同的路由段级别不能存在 route.js
文件。
支持的 HTTP 方法:GET
、POST
、PUT
、PATCH
、DELETE
、HEAD
和 OPTIONS
。如果调用了不受支持的方法,Next.js 将返回 405 Method Not Allowed
响应。
扩展的 NextRequest
和 NextResponse
API
NextRequest
和 NextResponse
API除了支持原生 RequestNextRequest
和 NextResponse
对其进行扩展,以便为高级用例提供便捷的辅助程序。
行为
缓存 路由配置选项 ,例如 export const dynamic = 'force-static'
。
app/items/route.tsexport const dynamic = 'force-static'
export async function GET() {
const res = await fetch('https://data.mongodb-api.com/...', {
headers: {
'Content-Type': 'application/json',
'API-Key': process.env.DATA_API_KEY,
},
})
const data = await res.json()
return Response.json({ data })
}
需知:其他受支持的 HTTP 方法不会被缓存,即使它们与被缓存的 GET
方法位于同一文件中。
特殊路由处理程序 sitemap.ts
、opengraph-image.tsx
和 icon.tsx
以及其他 元数据文件,除非它们使用动态 API 或动态配置选项,否则默认情况下保持静态。
路由解析 页面 路由 结果 app/page.js
app/route.js
冲突app/page.js
app/api/route.js
有效app/[用户]/page.js
app/api/route.js
有效
export const dynamic = 'force-static'
export async function GET() {
const res = await fetch('https://data.mongodb-api.com/...', {
headers: {
'Content-Type': 'application/json',
'API-Key': process.env.DATA_API_KEY,
},
})
const data = await res.json()
return Response.json({ data })
}
需知:其他受支持的 HTTP 方法不会被缓存,即使它们与被缓存的 GET
方法位于同一文件中。
sitemap.ts
opengraph-image.tsx
和 icon.tsx
以及其他 元数据文件,除非它们使用动态 API 或动态配置选项,否则默认情况下保持静态。
路由解析 页面 路由 结果 app/page.js
app/route.js
冲突app/page.js
app/api/route.js
有效app/[用户]/page.js
app/api/route.js
有效
页面 | 路由 | 结果 |
---|---|---|
app/page.js | app/route.js | |
app/page.js | app/api/route.js | |
app/[用户]/page.js | app/api/route.js |
每个 route.js
或 page.js
文件都会接管该路由的所有 HTTP 动词。
export default function Page() {
return <h1>Hello, Next.js!</h1>
}
// ❌ Conflict
// `app/route.js`
export async function POST(request) {}
示例
以下示例展示了如何将路由处理程序与其他 Next.js API 和功能结合使用。
重新验证缓存数据
您可以使用增量静态再生 (ISR) 重新验证缓存数据
export const revalidate = 60
export async function GET() {
const data = await fetch('https://api.vercel.app/blog')
const posts = await data.json()
return Response.json(posts)
}
Cookie cookies
读取或设置 Cookie。此服务器函数可以直接在路由处理程序中调用,也可以嵌套在另一个函数中。
cookies
或者,您可以使用 Set-Cookie
Response
。
import { cookies } from 'next/headers'
export async function GET(request: Request) {
const cookieStore = await cookies()
const token = cookieStore.get('token')
return new Response('Hello, Next.js!', {
status: 200,
headers: { 'Set-Cookie': `token=${token.value}` },
})
}
您还可以使用底层 Web API 从请求 (NextRequest
) 中读取 Cookie
import { type NextRequest } from 'next/server'
export async function GET(request: NextRequest) {
const token = request.cookies.get('token')
}
标头 headers
读取标头。此服务器函数可以直接在路由处理程序中调用,也可以嵌套在另一个函数中。
headers
此 headers
实例是只读的。要设置标头,您需要返回一个带有新 headers
的新 Response
。
import { headers } from 'next/headers'
export async function GET(request: Request) {
const headersList = await headers()
const referer = headersList.get('referer')
return new Response('Hello, Next.js!', {
status: 200,
headers: { referer: referer },
})
}
您还可以使用底层 Web API 从请求 (NextRequest
) 中读取标头
import { type NextRequest } from 'next/server'
export async function GET(request: NextRequest) {
const requestHeaders = new Headers(request.headers)
}
重定向 app/api/route.tsimport { redirect } from 'next/navigation'
export async function GET(request: Request) {
redirect('https://nextjs.net.cn/')
}
import { redirect } from 'next/navigation'
export async function GET(request: Request) {
redirect('https://nextjs.net.cn/')
}