安装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模块要求的彻底解决方式:
- 在服务器目录的
package.json中添加:"type": "module" - 修改
tsconfig.json的模块配置:{ "compilerOptions": { "module": "ESNext", "moduleResolution": "NodeNext", "target": "ES2020" } } - 服务器入口文件扩展名可改为
.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
相关产品推荐
相关产品推荐

