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