因此,我有一个使用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('/')
}
...
});
任何帮助都非常感激...