apollo-client, onError, ApolloProvider, client.writeData(localstate)… как обращаться с аутентификацией пользователя, когда сервер возвращает 401

#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:

Ответ для передачи клиента найден здесь: —

https://github.com/apollographql/apollo-link/issues/595