React-admin, как правильно обрабатывать ошибку аутентификации на dataProvider? - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь интегрировать провайдера аутентифицированных данных в React-Admin, но у меня возникают проблемы, когда у провайдера данных еще нет действительного токена авторизации от провайдера аутентификации.

Я использую https://github.com/des-des/ra-postgraphile-client

Мой код для создания экземпляра поставщика данных выглядит следующим образом:

const dataProvider = buildPostgraphileProvider({
  apolloHttpLinkOptions: {
    uri: `http://localhost:5433/graphql`,
    fetch: (url, options) => {
      // You can add custom auth logic with a wrapper around fetch
      const token = localStorage.getItem("token");

      if (!token) {
        return;
      }
      if (jwt.decode(token).exp < Date.now()) {
        localStorage.removeItem("token");
        return;
      }

      const headers = {
        ...options.headers,
        authorization: `bearer ${token}`
      };
      return fetch(url, { ...options, headers });
    }
  }
});
console.log(dataProvider);

Я ожидал, что когда React-Admin получит ошибку от поставщика данных, он перенаправит назад на главную страницу. Но вместо этого он выбрасывает необработанное отклонение.

Unhandled Rejection (Error): Network error: Cannot read property 'then' of undefined
new ApolloError
src/errors/ApolloError.ts:46
  43 | // Constructs an instance of ApolloError given a GraphQLError
  44 | // or a network error. Note that one of these has to be a valid
  45 | // value or the constructed error will be meaningless.
> 46 | constructor({
     | ^  47 |   graphQLErrors,
  48 |   networkError,
  49 |   errorMessage,

Я также пытался вернуть HTTPError, когда токена нет:

return new HttpError("denied", 403, { status: 403 });

И получил другой результат:

Unhandled Rejection (Error): Network error: fetcher(...).then is not a function

...