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