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

安装next-auth@beta到服务器时触发[ERR_REQUIRE_ESM]错误求助

问题解决:Next Auth v5(beta)在Express Apollo服务器中的ESM兼容与会话获取

问题根源

你碰到的ERR_REQUIRE_ESM错误,核心原因是Next Auth v5是纯ES模块(ESM),而你的Express服务器当前运行在CommonJS(CJS)环境下(ts-node默认处理CJS模块),直接用require导入ESM模块会触发Node.js的模块兼容性限制。另外,v5已重构会话获取API,原getSession的用法不再适用。

解决方案

方案1:将Express服务器切换为ESM模式

这是适配Next Auth v5模块要求的彻底解决方式:

  1. 在服务器目录的package.json中添加:
    "type": "module"
    
  2. 修改tsconfig.json的模块配置:
    {
      "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "NodeNext",
        "target": "ES2020"
      }
    }
    
  3. 服务器入口文件扩展名可改为.mts,或保持.ts但确保所有导入使用ESM的import语法,而非require。

方案2:在CJS环境中动态导入Next Auth模块

若不想切换模块系统,可通过动态import()加载ESM模块:

app.use(
  "/api/graphql",
  //@ts-ignore
  cors<cors.CorsRequest>(corsOptions),
  json(),
  expressMiddleware(server, {
    context: async ({ req }): Promise<IContext> => {
      if (!req.headers.cookie) {
        return { session: null, prisma, pubsub };
      }
      // 动态导入next-auth服务器端auth函数
      const { auth } = await import("next-auth");
      // v5中需传入请求对象,通过auth函数获取会话
      const session = await auth({ req });

      return {
        session: session as Session,
        pubsub,
        prisma,
      };
    },
  })
);

关键注意事项

  • Next Auth v5中,服务器端获取会话不再使用getSession,而是用auth函数,必须传入请求对象{ req }才能正确解析cookie中的会话信息。
  • 确保Express服务器的CORS配置允许前端传递cookie,比如设置credentials: true。
  • 若用ts-node运行ESM模式,需添加--esm参数,修改启动脚本示例:
    "scripts": {
      "start": "ts-node --esm server/api/index.ts"
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:00:04