next.js ApolloError:Invariant:方法需要requestAsyncStorage,但没有可用的

pxq42qpu  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一个Next.js项目,我使用next-auth进行授权。

说明情况:

我有一个用户列表,所以当我点击卡片时,它会用setContext将请求发送到服务器,setContext会为每个请求传递一个用户令牌,但我得到了这样一个错误:

ApolloError: Invariant: Method expects to have requestAsyncStorage, none available

字符串
但是当我从服务器获取用户时,没有问题,令牌工作正常。

  • 我尝试了什么?**

我花了很多时间试图找到答案,但没有一个答案对我有帮助。
另外,我尝试删除“getServerSession”,并在setContext头中手动设置令牌,它开始正常工作,没有错误。
所以最后我认为问题出在“getServerSession”上,但是我怎么才能从cookie中获取令牌呢?
“getSession”不是一个服务器端函数,所以它什么也没有给我。

资源:

下面是一段“apollo-client.ts”代码,我在其中使用了“setContext”

const wsLink =
  typeof window !== "undefined"
    ? new GraphQLWsLink(
        createClient({
          url: "ws://localhost:5000/subscriptions",
        })
      )
    : null;

const httpLink = createHttpLink({
  uri: "http://localhost:5000/",
  credentials: "same-origin",
});

const link =
  typeof window !== "undefined" && wsLink != null
    ? split(
        ({ query }) => {
          const def = getMainDefinition(query);
          return (
            def.kind === "OperationDefinition" &&
            def.operation === "subscription"
          );
        },
        wsLink,
        httpLink
      )
    : httpLink;

const authLink = setContext((_, { headers }) => {
  return getServerSession(authOptions).then((el) => {
    return {
      headers: {
        ...headers,
        authorization: el ? `Bearer ${el?.accessToken}` : "",
      },
    };
  });
});

const cache = new InMemoryCache();

const client = new ApolloClient({
  link: authLink.concat(link),
  cache: cache,
  uri: "http://localhost:5000/",
  credentials: "include",
});

export default client;

ne5o7dgx

ne5o7dgx1#

你正在全局模块范围内创建你的客户端,链接等-这意味着你创建了一个ApolloClient示例,它将在所有用户和你的服务器看到的请求之间共享。当使用像Next.js这样的SSR框架时,你不应该这样做。
这也是您看到此错误的原因-getServerSession想要访问当前请求,但您正在任何请求之外的上下文中调用它。
相反,创建一个函数来创建一个新的Apollo Client,并通过调用它为每个请求创建一个新的示例。几乎所有你能找到的“Apollo Client和Next.js”指南都应该展示这种模式。
您不能将模块范围的Apollo Client示例的仅客户端模式应用于Next.js。

相关问题