调用getServerSession触发next-auth实验性API警告的问题求助
问题描述
我在Node.js环境下的Express中间件中执行以下代码,用于和前端通信:
app.use( '/', cors<cors.CorsRequest>({ origin: 'http://localhost:3000', credentials: true, }), // 50mb 是 `startStandaloneServer` 默认的限制,可按需调整 bodyParser.json({ limit: '50mb' }), // expressMiddleware 接受和Apollo Server一致的参数: // Apollo Server实例和可选配置项 expressMiddleware(server, { context: async ({ req }) => { const session = await getServerSession(req); console.log("API SESSION: ", req.headers.cookie.match('(session-token)')); // token: req.headers.token, return {} }, }), );
但运行时出现如下警告:
[next-auth][warn][EXPERIMENTAL_API] `getServerSession` is used in a React Server Component.
我试过改用getSession(),但问题依旧。
解决方案
getServerSession和getSession都是NextAuth为Next.js专属环境(比如Server Component、App Router路由处理器、Pages API路由)设计的方法,你现在是在纯Express的Apollo中间件里调用,环境不匹配才会触发警告。
要在Express环境中获取NextAuth的session,直接手动解析请求中的session token即可:
- 先从请求的Cookie中提取NextAuth的session token(默认cookie名是
next-auth.session-token,如果自定义过配置就用你设置的名字) - 使用NextAuth的JWT工具或者你配置的session存储(比如数据库)来验证并解析token,拿到session数据。
示例代码:
import { jwtVerify } from "next-auth/jwt"; // 在你的expressMiddleware context里替换原来的getServerSession调用 context: async ({ req }) => { // 从cookie中提取session token const sessionToken = req.cookies['next-auth.session-token']; if (!sessionToken) { // 没有token,返回空session return { session: null }; } // 验证并解析token,这里的secret要和你NextAuth配置里的NEXTAUTH_SECRET一致 const session = await jwtVerify(sessionToken, { secret: process.env.NEXTAUTH_SECRET }); console.log("API SESSION: ", session); return { session }; },
注意:
- 确保你安装了
next-auth依赖,并且环境变量NEXTAUTH_SECRET和NextAuth配置中的一致 - 如果你的session不是存在JWT里(比如用了数据库存储),那需要直接查询对应的session表,用sessionToken去匹配获取数据
内容的提问来源于stack exchange,提问作者Sourav Chakraborty
相关产品推荐
相关产品推荐

