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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:07:07