从0死磕全栈之深入理解 Next.js 中的 NextResponse:API 详解与实战示例

在 Next.js 的 App Router 架构中,NextResponse 是一个强大而灵活的工具,用于在 MiddlewareRoute Handlers (API 路由)等服务器端逻辑中构造 HTTP 响应。它扩展了原生的 Web Response API,并提供了许多便捷方法,如设置 Cookie、重定向、重写路径、返回 JSON 等。


1. 基础用法:NextResponse.next()

next() 方法常用于 Middleware 中,表示"继续处理后续路由",同时允许你修改请求或响应。

ts 复制代码
// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  // 添加自定义请求头
  const newHeaders = new Headers(request.headers)
  newHeaders.set('x-custom-version', '1.0.0')

  return NextResponse.next({
    request: {
      headers: newHeaders,
    },
  })
}

✅ 用途:权限校验、A/B 测试、国际化路由等场景中"放行"请求。


NextResponse 提供了对 Set-Cookie 响应头的便捷操作。

ts 复制代码
// middleware.ts
import { NextResponse } from 'next/server'

export function middleware() {
  const response = NextResponse.next()
  response.cookies.set('show-banner', 'false', {
    path: '/home',
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
  })
  return response
}

📌 生成的响应头:

ini 复制代码
Set-Cookie: show-banner=false; Path=/home; HttpOnly; Secure
ts 复制代码
const bannerCookie = response.cookies.get('show-banner')
// 返回 { name: 'show-banner', value: 'false', Path: '/home' } 或 undefined
ts 复制代码
// 获取指定名称的所有 Cookie(支持多值)
const experiments = response.cookies.getAll('experiments')

// 获取所有 Cookie
const allCookies = response.cookies.getAll()
ts 复制代码
const deleted = response.cookies.delete('show-banner') // 返回 boolean

💡 注意:delete() 实际是设置该 Cookie 的过期时间为过去,从而让浏览器删除它。


3. 返回 JSON 响应:NextResponse.json()

在 Route Handler(如 app/api/user/route.ts)中非常常用:

ts 复制代码
// app/api/user/route.ts
import { NextResponse } from 'next/server'

export async function GET() {
  return NextResponse.json(
    { id: 1, name: 'Alice' },
    { status: 200 }
  )
}

export async function POST() {
  return NextResponse.json(
    { error: 'Invalid input' },
    { status: 400 }
  )
}

✅ 自动设置 Content-Type: application/json


4. 重定向:NextResponse.redirect()

用于身份验证、URL 规范化等场景。

ts 复制代码
// middleware.ts
import { NextResponse } from 'next/server'

export function middleware(request: NextRequest) {
  const isLoggedIn = false // 假设未登录

  if (!isLoggedIn) {
    const loginUrl = new URL('/login', request.url)
    loginUrl.searchParams.set('from', request.nextUrl.pathname)
    return NextResponse.redirect(loginUrl)
  }

  return NextResponse.next()
}

🔁 会返回 307 Temporary Redirect(或 308,取决于方法)。


5. 路径重写:NextResponse.rewrite()

与重定向不同,重写不会改变浏览器地址栏 URL,但会内部代理到另一个路径。

ts 复制代码
// middleware.ts
import { NextResponse } from 'next/server'

export function middleware(request: NextRequest) {
  if (request.nextUrl.pathname === '/secret') {
    // 用户访问 /secret,但实际渲染 /internal-page 的内容
    return NextResponse.rewrite(new URL('/internal-page', request.url))
  }

  return NextResponse.next()
}

🌐 适用于:动态内容代理、A/B 测试、隐藏真实路径等。


6. 完整示例:带认证的 Middleware

结合多种能力,实现一个简单的登录拦截器:

ts 复制代码
// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

const PUBLIC_PATHS = ['/login', '/signup', '/about']

export function middleware(request: NextRequest) {
  const path = request.nextUrl.pathname
  const token = request.cookies.get('auth-token')?.value

  // 公开路径直接放行
  if (PUBLIC_PATHS.some(p => path.startsWith(p))) {
    return NextResponse.next()
  }

  // 未登录则重定向到登录页
  if (!token) {
    const loginUrl = new URL('/login', request.url)
    loginUrl.searchParams.set('from', path)
    return NextResponse.redirect(loginUrl)
  }

  // 已登录:设置安全头并继续
  const response = NextResponse.next()
  response.cookies.set('last-visited', path, { maxAge: 60 * 60 }) // 1小时
  return response
}

export const config = {
  matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
}

总结

NextResponse 是 Next.js App Router 中处理服务器响应的核心工具,其主要能力包括:

方法 用途
next() 继续路由(Middleware)
json() 返回 JSON 响应
redirect() 重定向用户
rewrite() 内部重写路径(不改变 URL)
cookies.set/get/delete 操作响应 Cookie

通过合理使用这些方法,你可以构建高性能、安全且用户体验良好的 Next.js 应用。

相关推荐
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:ERP 企业资源模块,一个轻量级进销存的完整实现?
前端·javascript·vue.js·人工智能·前端框架·产品经理·ai编程
虹科网络安全6 小时前
艾体宝新闻|从 SQL 注入到服务器接管:CVE-2026-57517 暴露 Web 管理面板的供应链与安全编码风险
服务器·前端·sql
糖果店的幽灵6 小时前
langgraph的四种state解析
java·前端·javascript·langgraph
顺颂时绥_16 小时前
前端大图片压缩与安卓/苹果设备矫正实践
前端
Csvn6 小时前
JSON.parse 大数精度丢失:一个让前后端互相甩锅的 Bug
前端
Helen_cai6 小时前
OpenHarmony 项目统一全局样式、尺寸、色彩主题封装 ThemeUtil(API23)
开发语言·前端·javascript·华为·harmonyos
郑州光合科技余经理6 小时前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
小徐_23336 小时前
AI 写 wot-ui 总在猜 API?我们把 Skills、MCP 和 CLI 都配好了
前端·uni-app·ai编程
winfredzhang6 小时前
用 wxPython + ECharts + 阿里矢量地图,做一个可离线兜底的上海雨量看板
前端·javascript·echarts
索西引擎7 小时前
【React】Immer.js 在现代 Redux 生态中的角色:不可变性保障的工程化实现与开发体验优化
前端·javascript·react.js