我正在vue cli应用程序中的axios实例上使用响应拦截器,以检查响应是否返回401(即,请求中发送的令牌已过期),然后发送请求以刷新令牌(如果用户)拥有刷新令牌,否则返回原始错误。然后,应该让拦截器重新发送失败的请求,并且只有在不存在刷新令牌的情况下,才应该返回原始请求的错误。
这适用于我的许多请求(发布和删除请求),但是,我有一个get请求,该请求导致拦截器的行为异常。当令牌已过期(如预期)并且成功获取刷新令牌时,请求失败,并显示401,但是失败的请求永远不会重新发送新令牌,并且返回原错误,而原错误不应返回。
ApiInstance.interceptors.response.use(null, (error) => {
if (error.config && error.response && error.response.status === 401) {
var refreshToken = Auth.getRefreshTokenFromStorage();
if (refreshToken) {
var headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + refreshToken
};
ApiInstance.post('user/refreshToken', {}, { headers: headers }).then((result) => {
console.log(result);
Store.dispatch('setAuthenticated', { token: result.data.accessToken, user: result.data.user, refreshToken: refreshToken });
if(Router.currentRoute.name == "login") {
Router.push({ name: 'dashboard' })
}
error.config.headers.Authorization = 'Bearer ' + result.data.accessToken;
return ApiInstance.request(error.config); //This doesn't happen with the get request
}).catch(err => {
console.log(err);
console.log("Could not refresh Token");
});
} else {
console.log("else statement");
return Promise.reject(error);
}
}
});
get请求看起来像这样
getAllDockets() {
DocketService.getAllDockets().then(res => {
console.log(res.data);
this.items = res.data.result;
this.itemsEdited = res.data.result;
}).catch(err => {
console.log("An error occured");
})
}
我不应该从此方法获取“发生错误”日志输出。而且即使refreshToken请求成功,它也不会重新运行。
为了进行比较,下面是一个post方法,该方法在拦截器中的行为与预期相同。
addDocket() {
DocketService.addDocket({name: "something"}).then(result => {
alert("it worked");
}).catch(err => {
alert("an error occured");
})
}
有什么想法吗?