#reactjs #error-handling #apollo #react-apollo
#reactjs #обработка ошибок #apollo #реагировать-apollo
Вопрос:
Итак, у меня есть приложение, использующее apollo-graphql, где определенные распознаватели доступны только для пользователей, прошедших проверку подлинности, и они возвращают 401, если не прошедший проверку подлинности пользователь пытается получить к ним доступ. Я знаю, там нет ничего новаторского.
Тем не менее, я пытаюсь перехватить ошибку, обработать ее, вызвать функцию для выхода пользователя из системы (сбросить объект сеанса локального состояния), а затем перенаправить на «/ login».
Итак, здесь у меня ошибка onError: —
import { logout } from "_helpers"
const errorLink = onError(({ graphQLErrors, networkError }) => {
...
if (networkError amp;amp; 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}}}) работает нормально. Однако я хотел иметь версию функции, которую можно было бы вызывать без необходимости передавать client в аргументах, поэтому у меня есть вторая версия. Однако это не работает — похоже, он не запускает writeData() .
Итак, я хотел бы знать одно или оба из следующих: —
Почему не работает вторая версия (где ApolloProvider передает клиента)?
Если я хочу просто использовать версию logout(), где клиент передается как параметр, могу ли я каким-либо образом сделать клиент доступным внутри моего кода onError(), чтобы это было что-то вроде приведенного ниже?
const errorLink = onError(({ graphQLErrors, networkError }) => {
...
if (networkError amp;amp; networkError.statusCode === 401) {
logout(client)
history.push('/')
}
...
});
Любая помощь с благодарностью…
Ответ №1:
Ответ для передачи клиента найден здесь: —