如何在apollo-link-error中访问apollo客户端以resetStore?

时间:2018-08-03 02:32:36

标签: apollo react-apollo apollo-client

我正在基于JWT构建认证系统。

JWT已过期。 JWT过期时,我使用JWT捕获了apollo-link-error过期错误。我想调用apolloClient.resetStore()方法来重置缓存。

这是我的代码:

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors)
    graphQLErrors.map(error => {
      // console.log(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`)
      if (error.code === 1001) {
        auth.signout();

        // how can I get apollo client here?
        //client.resetStore();
      }
    });
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const client = new ApolloClient({
  cache,
  link: from([authMiddleware, errorLink, terminalLink])
});

我不确定apollo-link-error是处理过期JWT错误的正确地方。

2 个答案:

答案 0 :(得分:0)

Mikael的答案对我有用。 只需使用client.resetStore();像Mikael的答案一样在onError中。

但是,还请确保将errorLink链接到客户端,如下所示:

const client = new ApolloClient({
  cache,
  link: authLink.concat(errorLink).concat(restLink).concat(httpLink),
  resolvers
});

答案 1 :(得分:-1)

您应该可以直接直接致电客户:

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    client.resetStore();
  }
});

const client = new ApolloClient({
  cache: new InMemoryCache({ fragmentMatcher }),
  link: ApolloLink.from([
    errorLink,
    // otherLink,
    // otherLink,
  ]),
});

您甚至可以从嵌套的配置函数中调用它:

const client = new ApolloClient({
  cache: new InMemoryCache({ fragmentMatcher }),
  link: ApolloLink.from([
    onError(({ graphQLErrors, networkError }) => {
      if (graphQLErrors) {
        client.resetStore();
      }
    }),
    // otherLink,
    // otherLink,
  ]),
});