apollo-client, onError, ApolloProvider, client.writeData (localstate) ... как обрабатывать аутентификацию пользователя, когда сервер возвращает 401 - PullRequest
0 голосов
/ 15 апреля 2019

Итак, у меня есть приложение, использующее 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('/')
    }
    ...
});

Любая помощь с благодарностью ...

1 Ответ

0 голосов
/ 15 апреля 2019

Ответ для проходящего клиента найден здесь: -

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

...