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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:48:30