Как установить токен в OnError ApolloClient? - PullRequest
0 голосов
/ 11 мая 2019

Я хочу обработать ошибку, если return error снова вызовет setContext для запроса, но я не могу получить токен в локальном состоянии, потому что onError не принимает асинхронный вызов. Как я могу это сделать. Спасибо

//
export default async () =>
  new ApolloClient({
    cache: new InMemoryCache({
      dataIdFromObject: object => object.key || null
    }),
    uri: Api.GRAPH_QL_URL,
    clientState: { defaults, resolvers },

    // cho handle network failed
///onError not accept async
    onError: ({ graphQLErrors, networkError, operation, forward }) => {
      // how to get token in hear
      if (networkError) {
        operation.setContext({
          headers: {
            Accept: "application/json",
            authorization: token !== null ? `JWT ${token}` : ""   // how to put token into authorization
          }
        });
      }
    },
// Call query
    request: async operation => {
      const token = await AsyncStorage.getItem(strings.keyToken);

      console.log("Client request: ", {
        operationName: operation.operationName,
        variables: operation.variables,
        query: operation.query,
        jwtoken: token
      });
      operation.setContext({
        headers: {
          Accept: "application/json",
          authorization: token !== null ? `JWT ${token}` : ""
        }
      });
    },
  });
  //I want to handle error if return error will call setContext for query again but I can't get token in local state. How I can do that.
Thanks

1 Ответ

0 голосов
/ 11 мая 2019

Вам нужно установить Observable для работы с async/await внутри метода onError.

Импорт из apollo-link (import { Observable } from 'apollo-link';).

onError: ({ graphQLErrors, networkError, operation, forward }) => {
  if (networkError) {
    return new Observable(async (observer) => {
      const token = await AsyncStorage.getItem(strings.keyToken);

      const headers = operation.getContext().headers;

      operation.setContext({
        headers: {
          ...headers,
          Authorization: token !== null ? `JWT ${token}` : ''              
        }
      });

      const subscriber = {
        next: observer.next.bind(observer),
        error: observer.error.bind(observer),
        complete: observer.complete.bind(observer),
      };

      return forward(operation).subscribe(subscriber);
    });
  }
}
...