在Axios中,你可以通过使用拦截器来处理请求和响应。为了解决Axios拦截器使用旧的令牌而不是新获取的访问令牌进行重试的问题,你可以使用以下代码示例:
import axios from 'axios';
// 创建一个Axios实例
const api = axios.create({
baseURL: 'https://api.example.com',
});
// 请求拦截器
api.interceptors.request.use(
(config) => {
// 在发送请求之前,检查是否有新的访问令牌
const newAccessToken = getNewAccessToken();
if (newAccessToken) {
// 如果有新的访问令牌,将其设置到请求头中
config.headers['Authorization'] = `Bearer ${newAccessToken}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 响应拦截器
api.interceptors.response.use(
(response) => {
return response;
},
(error) => {
// 如果响应返回401错误(未授权),并且没有进行过重试
if (error.response.status === 401 && !error.config._retry) {
error.config._retry = true;
// 获取新的访问令牌
return getNewAccessToken()
.then((newAccessToken) => {
// 如果成功获取新的访问令牌,将其设置到请求头中并重试请求
error.config.headers['Authorization'] = `Bearer ${newAccessToken}`;
return axios(error.config);
})
.catch((error) => {
return Promise.reject(error);
});
}
return Promise.reject(error);
}
);
// 示例API请求
api.get('/data')
.then((response) => {
console.log(response.data);
})
.catch((error) => {
console.error(error);
});
// 模拟获取新的访问令牌
function getNewAccessToken() {
// 返回一个Promise,用于模拟异步操作
return new Promise((resolve, reject) => {
// 模拟异步获取新的访问令牌
setTimeout(() => {
const newAccessToken = 'new_access_token';
resolve(newAccessToken);
}, 2000);
});
}
在上面的示例中,我们创建了一个名为api的Axios实例,并添加了请求和响应拦截器。在请求拦截器中,我们检查是否有新的访问令牌,并将其设置到请求头中。在响应拦截器中,如果响应返回401错误(未授权),并且没有进行过重试,我们会获取新的访问令牌,并将其设置到请求头中并重试请求。这样,即使在请求过程中访问令牌过期,我们也能够获取新的访问令牌并重试请求。