You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Next.js App Router页面中获取request/response对象?

在Next.js App Router中获取Request/Response对象的方法

在App Router中确实移除了Pages Router里的getStaticProps这类函数,但针对不同运行场景,Next.js提供了对应的方式来获取请求相关信息:

1. 服务器组件(Server Components)

服务器组件运行在服务端,可直接获取请求相关数据:

  • 获取请求头与Cookie:使用Next.js内置的headers()和cookies()函数(仅能在服务器组件中调用),示例:
    import { headers, cookies } from 'next/headers';
    
    export default async function Page() {
      const headersList = headers();
      const cookieStore = cookies();
      const userAgent = headersList.get('user-agent');
      const theme = cookieStore.get('theme')?.value;
    
      return <div>用户代理:{userAgent}</div>;
    }
    
  • 获取完整Request对象:在Server Actions中,可通过参数自动注入Request对象(Next.js 13.4+已稳定支持Server Actions):
    'use server';
    
    export async function submitForm(formData: FormData, request: Request) {
      const origin = request.headers.get('origin');
      // 业务处理逻辑
    }
    

2. 客户端组件(Client Components)

客户端组件运行在浏览器端,无法直接获取服务端的Request/Response对象,可通过两种方式间接获取所需信息:

  • 由父级服务器组件将需要的请求数据(如用户代理、Cookie值等)作为props传递给客户端组件。
  • 调用App Router下的API路由,在API路由中获取请求信息后返回给客户端组件。

3. API路由(App Router)

在app/api/[path]/route.js格式的API路由中,处理函数可直接接收NextRequest和NextResponse对象,示例:

import { NextRequest, NextResponse } from 'next/server';

export async function GET(request: NextRequest) {
  const requestUrl = request.nextUrl;
  const authHeader = request.headers.get('authorization');
  
  return NextResponse.json({ 
    路径: requestUrl.pathname,
    授权状态: authHeader ? '已携带' : '未携带'
  });
}

4. 中间件(Middleware)

在项目根目录的middleware.js文件中,可拦截所有请求,直接获取NextRequest和NextResponse对象,用于路由守卫、修改请求/响应头等场景:

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  if (request.nextUrl.pathname.startsWith('/admin')) {
    const isAuth = request.cookies.has('admin_token');
    if (!isAuth) {
      return NextResponse.redirect(new URL('/login', request.url));
    }
  }
  return NextResponse.next();
}

注意:服务器组件中无法直接操作Response对象(响应由Next.js统一处理),若需自定义响应,建议使用API路由或中间件。

内容的提问来源于stack exchange,提问作者machineghost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:36:10