首页
/ Next.js 路由处理器(route.js)深度解析

Next.js 路由处理器(route.js)深度解析

2025-07-05 01:05:25作者:董宙帆

什么是路由处理器?

在 Next.js 应用中,路由处理器(route.js)是一种特殊的文件约定,它允许开发者基于 Web 标准的 Request 和 Response API 为特定路由创建自定义请求处理器。这种机制为构建 API 端点提供了极大的灵活性,同时保持了与 Web 标准的兼容性。

核心特性

HTTP 方法支持

路由处理器支持所有标准 HTTP 方法,包括:

  • GET:获取资源
  • POST:创建资源
  • PUT:更新整个资源
  • PATCH:部分更新资源
  • DELETE:删除资源
  • HEAD:获取资源头信息
  • OPTIONS:获取支持的HTTP方法
// 示例:支持多种HTTP方法的路由处理器
export async function GET(request) {
  // 处理GET请求逻辑
}

export async function POST(request) {
  // 处理POST请求逻辑
}

特别值得注意的是,OPTIONS 方法在未显式定义时,Next.js 会自动实现并根据已定义的其他方法设置适当的 Response Allow 头部。

参数详解

Request 对象

路由处理器接收的 request 参数是 NextRequest 对象,它扩展了标准的 Web Request API,提供了更多便利功能:

  • 便捷的 cookies 访问
  • 增强的 URL 解析(nextUrl)
  • 请求头操作
  • 请求体解析
export async function GET(request) {
  // 访问cookie
  const token = request.cookies.get('authToken');
  
  // 获取查询参数
  const searchParams = request.nextUrl.searchParams;
  const page = searchParams.get('page');
}

Context 参数

context 参数目前主要包含路由的动态参数(params),这在处理动态路由时特别有用:

// 文件路径: app/products/[id]/route.js
export async function GET(request, { params }) {
  const productId = params.id; // 获取动态路由参数
}

动态路由参数支持多种匹配模式:

  1. 单参数匹配:[param]
  2. 多参数匹配:[tag]/[item]
  3. 捕获所有路由:[...slug]

响应处理

路由处理器可以返回标准的 Response 对象,也可以使用 Next.js 提供的增强版 NextResponse:

import { NextResponse } from 'next/server';

export async function GET() {
  // 返回JSON响应
  return NextResponse.json({ message: '成功' }, { status: 200 });
  
  // 重定向
  return NextResponse.redirect('/new-location');
  
  // 设置cookie
  const response = NextResponse.json({});
  response.cookies.set('theme', 'dark');
  return response;
}

最佳实践

  1. 组织API端点:将相关API端点组织在同一路由下,保持代码结构清晰
  2. 错误处理:统一处理错误,返回适当的HTTP状态码
  3. 类型安全:使用TypeScript增强类型检查
  4. 中间件:结合Next.js中间件处理认证等跨路由逻辑
  5. 缓存策略:根据需求设置适当的缓存头

版本演进

  • v15.0.0:GET 处理器的默认缓存行为从静态更改为动态
  • v13.2.0:首次引入路由处理器功能

总结

Next.js 的路由处理器提供了一种现代化、符合Web标准的方式来构建API端点。它完美集成在应用路由(App Router)中,消除了传统API路由(pages)和页面路由分离的需要。通过利用Web标准API和Next.js的扩展功能,开发者可以构建高效、灵活的后端逻辑,同时保持代码的一致性和可维护性。

对于新项目,建议直接使用路由处理器而非传统的API路由,它能更好地与现代React特性(如Server Components)配合工作,提供更一致的开发体验。