Axios拦截器已针对某些请求正确触发,但对其他一些请求却未正确触发

时间:2018-12-07 01:26:06

标签: vue.js token axios interceptor refresh-token

我正在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");
        })
    }

有什么想法吗?

0 个答案:

没有答案