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

问题描述 投票:0回答:1

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

但是,我试图拦截错误,处理它,调用一个函数来记录用户(重置本地状态会话对象)然后重定向到“/ login”。

所以,这里我有onError: -

import { logout } from "_helpers"

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

现在,我有2个版本的logout()函数 - 一个是在道具中传递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}}})
}

第一个版本 - 客户端在参数中传递 - 已在组件中尝试和测试,其中客户端已经可用于调用logout()的代码,因此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('/')
    }
    ...
});

任何帮助非常感谢...

reactjs error-handling apollo react-apollo
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.