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

如何从Next.js 12的middleware向route handler传递参数

Next.js 12 中间件向路由处理函数传递自定义参数方案

Next.js 12 的中间件运行在Edge Runtime环境,和后续API路由所处的Node.js Runtime是相互隔离的,无法直接在req对象上挂载自定义属性透传,目前稳定可用的透传方式如下:

方案1:通过自定义请求头传递(推荐,适合敏感参数)

这是官方推荐的透传方式,参数不会暴露在URL中,适合传递鉴权解析得到的敏感字段比如companyId。
首先修改中间件代码,鉴权通过后克隆请求头,追加自定义头后再调用NextResponse.next():

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

export async function middleware(req: NextRequest) {
  // 修正原代码笔误:参数名为req,不要误写为request
  if (req.nextUrl.pathname.startsWith("/user")) {
    const tokenValue = req.cookies.get("token")?.value
    const { valid, token } = await authVerify(tokenValue)
    if (!valid) {
      return NextResponse.json(
        { valid: false, message: "invalid token" },
        { status: 401 }
      )
    }
    // 从解析后的token中取出companyId,按你实际的token结构取值即可
    const companyId = token.companyId
    // 基于原有请求头创建新的头对象,追加自定义透传头,建议统一加x-前缀标识
    const passThroughHeaders = new Headers(req.headers)
    passThroughHeaders.set('x-company-id', String(companyId))

    return NextResponse.next({
      request: {
        headers: passThroughHeaders
      }
    })
  }
}

在对应的API路由处理函数中,直接从请求头中读取透传的参数即可:

import type { NextApiRequest, NextApiResponse } from 'next'

export default async function getAllUserHandler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  // 自定义请求头会被自动转为小写key读取
  const companyId = req.headers['x-company-id'] as string
  // 可选:增加参数存在性校验
  if (!companyId) {
    return res.status(401).json({ message: "authentication failed" })
  }
  const userData = await userQuery(companyId)
  return res.status(200).json(userData)
}

方案2:通过URL查询参数传递(不推荐用于敏感字段)

如果传递的是非敏感参数,可以在中间件中克隆目标URL,追加searchParams后通过rewrite转发,路由中通过req.query读取对应参数。由于companyId属于鉴权关联的敏感字段,该方案存在参数被日志记录、泄露的风险,不适合当前场景。

注意:不要尝试直接给中间件入参的req对象挂载自定义属性,两个运行时上下文内存不共享,挂载的属性无法被后续路由读取。自定义请求头注意不要和HTTP标准头重名,避免出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:06:20