axios 当在上下文中更改内部使用的值时,React-query查询函数不更新

ufj5ltwl  于 2022-11-23  发布在  iOS
关注(0)|答案(1)|浏览(108)

我通过useContext钩子在查询函数中传递请求头中用作Bearer令牌的访问令牌,但是当访问令牌在一段时间后被刷新时,react query在查询函数中继续使用旧的访问令牌。
这是使用react-query的组件:

const Profile = () => {
  const { fetchUser} = useAppContext();
  const { data, isLoading, isError, error } = useQuery(
    ['users'],
    fetchUser
  );

  //...
}

这个axios拦截器与上下文一起传递:

const authFetch = axios.create({
    baseURL: '/api/v1',
    headers: {
      Authorization: `Bearer ${state.accessToken}`,
    },
  });

  authFetch.interceptors.response.use(
    (response) => response,
    async (error) => {
      const status = error?.response?.status;
      if (status === 401) {
        const config = error.config;
        const accessToken = await refreshAccessToken();
        config.headers['Authorization'] = `Bearer ${accessToken}`;
        return axios.request(config);
      }
      return Promise.reject(error);
    }
  );

await refreshAccessToken()从服务器获取新的访问令牌,并在上下文状态中更新它,然后将其返回。)
useQuery内部使用的函数也会与上下文一起传递:

const fetchUser = async () => {
    const { data } = await authFetch.get('/users');
    return data;
  };

但是当访问令牌被刷新时,useQuery在查询函数中仍然使用旧的访问令牌。我如何构造我的应用,使查询在每次更新后都使用新的令牌呢?

eagi6jfj

eagi6jfj1#

问题是你关闭了你的queryFn中的令牌,你没有显示这个,但是我猜state.accessToken来自useContext左右。
一般来说,你在queryFn中使用的所有东西都应该是queryKey的一部分。因此,一种解决方法是将令牌添加到queryKey中。通过与keepPreviousData: true结合,你将在创建新的缓存条目时看到旧的数据。

相关问题