使用unstable_getServerSession时出现未捕获的TypeError错误
解决Next.js Middleware中使用unstable_getServerSession的TypeError问题
问题根源
你遇到的TypeError核心原因是:unstable_getServerSession是为API路由设计的方法,它要求传入的req和res必须符合NextApiRequest/NextApiResponse的规范,但Middleware中的NextRequest/NextResponse对象结构和API路由的请求响应对象完全不同,直接传入会导致类型不兼容,触发错误。另外你写的两个middleware函数同名,这本身也会导致代码冲突。
正确解决方案
方案1:改用NextAuth的getToken方法(推荐)
在Middleware场景下,NextAuth提供了更适配的getToken方法来获取会话令牌,无需依赖API路由的请求对象:
import { NextRequest, NextResponse } from "next/server"; import { getToken } from "next-auth/jwt"; import { authOptions } from "./pages/api/auth/[...nextauth]"; export async function middleware(req: NextRequest) { // 获取JWT令牌,包含session中的核心数据 const token = await getToken({ req, secret: authOptions.secret, // 生产环境下需开启secureCookie,确保Cookie安全传输 secureCookie: process.env.NODE_ENV === "production" }); // 这里可以用token中的数据调用上游服务 if (token) { // 示例:用token里的用户ID调用接口 // const userData = await fetch(`https://your-api/user/${token.id}`); } return NextResponse.next(); }
方案2:适配API路由对象(不推荐,仅作参考)
如果一定要使用unstable_getServerSession,需要手动将Middleware的req转换为API路由兼容的格式,但这种方式依赖Next.js内部实现,稳定性较差:
import { NextRequest, NextResponse } from "next/server"; import { unstable_getServerSession } from "next-auth/next"; import { authOptions } from "./pages/api/auth/[...nextauth]"; import type { NextApiRequest, NextApiResponse } from "next"; export async function middleware(req: NextRequest) { // 构造API路由兼容的req对象 const apiReq = req as unknown as NextApiRequest; // 构造满足unstable_getServerSession要求的res对象 const apiRes = { getHeader: (key: string) => req.headers.get(key), setHeader: () => {}, end: () => {} } as unknown as NextApiResponse; try { const session = await unstable_getServerSession(apiReq, apiRes, authOptions); // 使用session数据调用上游服务 } catch (err) { console.error("获取session失败:", err); } return NextResponse.next(); }
额外注意事项
- 确保
authOptions中的secret与.env文件里的NEXTAUTH_SECRET完全一致 - 同一个文件中只能定义一个
middleware函数,避免代码覆盖 - 若使用Next.js 13+ App Router,需保证Middleware文件位置和写法符合对应版本规范
内容的提问来源于stack exchange,提问作者Ygbh
相关产品推荐
相关产品推荐

