所以我有一个使用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('/')
}
...
});
任何帮助非常感谢...
在这里找到通过客户的答案: -