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

时间:2019-04-15 14:39:08

标签: reactjs error-handling apollo react-apollo

因此,我有一个使用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:{...会话,isAuthed:false}}})工作正常。但是,我希望有一个版本的函数,而不必在参数中传递客户即可被调用,这就是为什么我有第二个版本。但是,这不起作用-它似乎没有运行writeData()。

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

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

如果我只想使用将客户端作为参数传递的logout()版本,有什么办法可以使onError()代码中的客户端可用,因此如下所示?

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

任何帮助都非常感激...

1 个答案:

答案 0 :(得分:0)

在此处找到传递客户的答案:-

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