Перехватчик Axios правильно запускается для некоторых запросов, но не для других - PullRequest
0 голосов
/ 07 декабря 2018

Я использую перехватчик ответа на своем экземпляре axios в приложении vue cli, чтобы проверить, вернул ли ответ 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");
        })
    }

Любые идеи о том, что происходитздесь

...