ApolloClient在刷新token过期时没有执行onError链接
创始人
2024-09-09 08:00:48
0

这个问题可以通过在Apollo Client的links中添加一个错误链接来解决。当刷新token过期时,错误链接将被调用,并且我们可以使用它来执行所需的操作。以下是解决此问题的示例代码:

import { ApolloLink, Observable } from "apollo-link";
import { onError } from "apollo-link-error";
import { setContext } from "apollo-link-context";
import { HttpLink } from "apollo-link-http";
import { withClientState } from "apollo-link-state";
import { InMemoryCache } from "apollo-cache-inmemory";
import { ApolloClient } from "apollo-client";
import Token from "./utils/token";

const httpLink = new HttpLink({
  uri: "graphql_server_url"
});

const authLink = setContext(async (req, { headers }) => {
  const token = await Token.load();

  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : ""
    }
  };
});

const errorLink = onError(({ response, graphQLErrors, networkError }) => {
  if (graphQLErrors && graphQLErrors.some(isUnauthorizedError)) {
    Token.delete(); // 清除旧令牌
    window.location.replace("/login"); // 重定向到登录页
  }
});

const defaultOptions = {
  watchQuery: {
    fetchPolicy: "cache-and-network",
    errorPolicy: "all"
  },
  query: {
    fetchPolicy: "cache-and-network",
    errorPolicy: "all"
  }
};

const cache = new InMemoryCache();

const stateLink = withClientState({cache});

const links = ApolloLink.from([
  stateLink,
  errorLink,
  authLink,
  httpLink
]);

const apolloClient = new ApolloClient({
  link: links,
  cache: cache,
  defaultOptions: defaultOptions
});

function isUnauthorizedError(error) {
  const { extensions } = error;
  const { code } = extensions || {};

  return code === "UNAUTHENTICATED";
}

export default apolloClient;

在代码中,我们添加了一个错误链接(errorLink),该链接将在遇到GraphQL错误时执行。具体而言,我们检查GraphQLErrors中是否有UNAUTHENTICATED代码的错误,如果是,则清除旧令牌并重定向到登录页面。当links中的其余链接(authLink和httpLink)使用时,我们确保在请求头中包含有效的令牌。最后,我们导出一个初始化的Apollo客户端实例(

相关内容

热门资讯

重大消息((poker wor... 重大消息((poker world))外挂透明挂辅助神器(透视辅助)好像真的有挂(力荐教程)-百度贴...
重大通报((wepOkE))外... 重大通报((wepOkE))外挂透明挂辅助APP(透视辅助)原来真的有挂(黑科技教程)-头条暗藏猫腻...
新手必备((wepower))... 新手必备((wepower))外挂透明挂辅助安装(智能辅助)都是真的有挂(2025新版技巧)-小红书...
玩家必看科普((德扑之星))外... 玩家必看科普((德扑之星))外挂透明挂辅助神器(wepoke辅助)果真真的有挂(微扑克教程)-知乎;...
重大科普((wepOKE))外... 重大科普((wepOKE))外挂透明挂辅助app(脚本辅助挂)果真真的有挂(揭秘教程)-小红书;暗藏...
实测教程((WPK))外挂透明... 实测教程((WPK))外挂透明挂辅助软件(黑科技辅助挂)一直真的有挂(技巧教程)-今日头条1、玩家可...
带你了解((德州app))外挂... 带你了解((德州app))外挂透明挂辅助安装(脚本辅助挂)就是真的有挂(AA德州教程)-小红书1)辅...
重大通报((impoker德州... 重大通报((impoker德州))外挂透明挂辅助插件(黑科技辅助)其实真的有挂(wpk教程)-微博热...
实操分享((pokerrrr2... 实操分享((pokerrrr2))外挂透明挂辅助工具(德州辅助)果然真的有挂(必备教程)-知乎1、任...
最新通报((智星德州))外挂透... 最新通报((智星德州))外挂透明挂辅助黑科技(黑科技辅助挂)就是真的有挂(透牌教程)-微博热搜1、操...