Итак, у меня есть приложение, использующее 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 (), где client передается как параметр, есть ли способ сделать клиента доступным внутри моегоonError () код, так что это что-то вроде ниже?
const errorLink = onError(({ graphQLErrors, networkError }) => {
...
if (networkError && networkError.statusCode === 401) {
logout(client)
history.push('/')
}
...
});
Любая помощь с благодарностью ...