apollo-client, onError, ApolloProvider, client.writeData(localstate)... 服务器 returns 401 时如何处理用户身份验证

apollo-client, onError, ApolloProvider, client.writeData(localstate)... how to handle authenticating a user when server returns 401

所以我有一个使用 apollo-graphql 的应用程序,其中某些解析器仅对经过身份验证的用户可用,如果未经身份验证的用户试图访问它们,它们 return 会返回 401。我知道那里没有开创性的东西。

但是,我正在尝试拦截错误、处理错误、调用函数将用户注销(重置本地状态会话对象)然后重定向到“/login”。

所以,这里我有 onError:-

import { logout } from "_helpers"

const errorLink = onError(({ graphQLErrors, networkError }) => {    
    ...
    if (networkError && networkError.statusCode === 401) {
        logout()
        history.push('/')
    }
    ...
});

现在,我有 2 个版本的 logout() 函数 - 一个是在 props 中传递 apollo 客户端,另一个是我尝试使用 ApolloProvider 使其可用:-

import { ApolloConsumer } from "react-apollo"

export const logout = () => {
  return (
    <ApolloConsumer>
    {client => client.writeData({data: {session: {...session, isAuthed: false}}})}
    </ApolloConsumer>
  )
}

export const logout = (client) => {
    client.writeData({data: {session: {...session, isAuthed: false}}})
}

第一个版本——在参数中传递客户端——已经在客户端已经可用于调用注销()的代码的组件中进行了尝试和测试,因此client.writeData({data:{session: {...session, isAuthed: false}}}) 工作正常。但是,我想要一个可以调用的函数版本,而无需在参数中传递客户端,这就是我有第二个版本的原因。但是,这不起作用 - 它似乎 运行 writeData().

所以我想知道以下一项或两项:-

为什么第二个版本(ApolloProvider 正在传递客户端)不起作用?

如果我想简单地使用 logout() 的一个版本,其中客户端作为参数传递,有没有什么方法可以让客户端在我的 onError() 代码中可用,就像下面这样?

const errorLink = onError(({ graphQLErrors, networkError }) => {
    ...
    if (networkError && networkError.statusCode === 401) {
        logout(client)
        history.push('/')
    }
    ...
});

非常感谢任何帮助...

在这里找到路过客户的答案:-

https://github.com/apollographql/apollo-link/issues/595