我通过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在查询函数中仍然使用旧的访问令牌。我如何构造我的应用,使查询在每次更新后都使用新的令牌呢?
1条答案
按热度按时间eagi6jfj1#
问题是你关闭了你的
queryFn
中的令牌,你没有显示这个,但是我猜state.accessToken
来自useContext
左右。一般来说,你在queryFn中使用的所有东西都应该是queryKey的一部分。因此,一种解决方法是将令牌添加到queryKey中。通过与
keepPreviousData: true
结合,你将在创建新的缓存条目时看到旧的数据。