如何从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
相关产品推荐
相关产品推荐

