我在使用useContext hook将用作请求标头中Bearer token的访问令牌传递到查询函数中。但是当访问令牌在一段时间后刷新时,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函数仍然在查询中使用旧的访问令牌。我该如何构建我的应用程序,以便在更新后每次查询都使用新的令牌?
cacheTime
(默认为15分钟)后被垃圾回收。这不应该是一个问题。再考虑一下:如果您设置了axios拦截器,它如何访问react上下文?我认为我还没有完全理解。为什么不将token存储在react之外,并直接访问请求拦截器呢? - TkDodo