Next.js+next-auth+Apollo Client报错:requestAsyncStorage不可用求助
问题解决:NextAuth + Apollo Client 中
getServerSession 导致的 requestAsyncStorage 错误 问题原因
getServerSession 必须在Next.js服务端上下文(如服务器组件、API路由、Server Actions)中调用,它依赖Next.js的RequestAsyncStorage获取请求上下文。而你在Apollo的authLink中直接调用getServerSession,当请求在客户端触发(比如点击用户卡片的交互)时,不存在服务端请求上下文,就会抛出requestAsyncStorage不可用的错误。
获取用户列表时正常,是因为该请求大概率在服务端执行(SSR/SSG场景),此时存在服务端上下文,getServerSession能正常工作。
解决方法
需要区分客户端请求和服务端请求,分别处理令牌获取逻辑:
1. 客户端请求:用getSession或直接读Cookie
客户端环境中,可使用NextAuth提供的客户端方法getSession,或手动从Cookie中读取令牌(NextAuth默认将会话信息存在next-auth.session-token Cookie中,若自定义了accessToken存储路径,对应替换即可)。
2. 服务端请求:保留getServerSession
在服务端上下文(如SSR渲染时的请求),依然可以安全使用getServerSession获取令牌。
修改后的Apollo Client配置代码
import { getServerSession } from "next-auth/next"; import { getSession } from "next-auth/react"; import { authOptions } from "../path/to/your/authOptions"; // 替换为你的authOptions实际路径 // --- 原有wsLink、httpLink、link代码保持不变 --- const authLink = setContext(async (_, { headers }) => { // 区分客户端与服务端环境 if (typeof window !== "undefined") { // 客户端场景:调用getSession获取会话 const session = await getSession(); return { headers: { ...headers, authorization: session ? `Bearer ${session.accessToken}` : "", }, }; } else { // 服务端场景:调用getServerSession获取会话 const session = await getServerSession(authOptions); return { headers: { ...headers, authorization: session ? `Bearer ${session.accessToken}` : "", }, }; } }); // --- 原有cache、client实例化代码保持不变 ---
备选方案:手动读取Cookie(客户端)
若getSession仍无法获取有效内容,可直接从Cookie中提取令牌:
// 客户端Cookie读取工具函数 const getCookie = (name: string) => { if (!document.cookie) return null; const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`)); return match ? match[2] : null; }; // 在authLink的客户端分支中使用 const accessToken = getCookie("your-access-token-cookie-name"); // 替换为你的Cookie名称 return { headers: { ...headers, authorization: accessToken ? `Bearer ${accessToken}` : "", }, };
关键注意点
getSession是NextAuth专为客户端设计的方法,必须在客户端环境调用(通过typeof window !== "undefined"判断),才能正确读取客户端会话信息。- 服务端环境下必须使用
getServerSession,且需传入你的authOptions,它会自动从请求Cookie中解析会话数据。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

