我有以下代码并且拦截器工作得很好:
import axios from 'axios';
import { useDispatch } from 'react-redux';
const axiosPrivate = axios.create({
baseURL: 'http://localhost:8080'
});
export default useAxiosPrivate = () => {
const dispatch = useDispatch();
useEffect(() => {
const responseIntercept = axiosPrivate.interceptors.response.use(
response => response,
async (error) => {
const prevRequest = error?.config;
if (error.response?.status === 401 && error.response.data?.code === 'AccessTokenExpired' && !prevRequest.sent) {
prevRequest.sent = true;
const { refreshToken } = await getData();
return axios.post('http://localhost:8080/auth/refresh-token', { refreshToken })
.then(async (_) => {
return axiosPrivate(prevRequest);
})
.catch(async (error) => {
dispatch(login({ name: '', id: '' }));
return Promise.reject(error);
});
}
return Promise.reject(error);
}
);
return () => {
axiosPrivate.interceptors.response.eject(responseIntercept);
}
}, [])
return axiosPrivate;
}
然而,出于好奇,我尝试将 axiosPrivate 常量放置在组件代码中,如下所示:
export default useAxiosPrivate = () => {
const axiosPrivate = axios.create({
baseURL: 'localhost:8080'
});
const dispatch = useDispatch();
...}
执行此操作时,在某些组件中 useAxiosPrivate 钩子拦截器可以正常工作,而在其他组件中则无法正常工作,就好像它们不存在一样。
谁能告诉我为什么会出现这种现象?
当你将它放入钩子中时,每次钩子重新渲染时,你都会创建一个新的 axios 实例,这并不好。
您的拦截器仅适用于第一个实例,因为仅在 mount 上
useEffect
运行。您的钩子始终返回最新创建的实例。因此,如果钩子渲染不止一次,那么您就倒霉了。