I've been trying for two hours to figure out when onRejected
will work in axios.interceptors.request.use
. I searched everywhere, but I didn't find an answer. I want to handle all cases where the request fails. Basically my goal is to find out if the request will be repeated if it is rejected in axios.interceptors.request.use
. I'm using axios-retry
. I did my best to simulate this state, but it didn't work.
The documentation says (axios-retry)
retry on Network Error & 5xx responses
Please, can you help me? Thank you in advance.
import axios from "axios";
import store from './store/index';
import router from "./router";
import axiosRetry from "axios-retry";
export const HTTP = axios.create({
baseURL: '/api/'
});
HTTP.defaults.showLoader = true;
HTTP.interceptors.request.use(
request => {
store.commit('loader_x/PENDING');
const token = store.getters["auth_x/token"];
if (token) {
request.headers["Authorization"] = token;
}
// return false;
// throw new Error('Request ERROR');
return request;
},
error => {
console.log('ERROR REQUEST');
store.commit('loader_x/DONE');
return Promise.reject(error);
}
);
HTTP.interceptors.response.use(
response => {
store.commit('loader_x/DONE');
return response;
},
error => {
console.log('RESPONSE ERROR');
if ('sub_code' in error.response.data) {
switch (error.response.data.sub_code) {
case 403:
HTTP.post('refresh-token')
.then(res => {
const authToken = res.data.token_type + ' ' + res.data.access_token;
store.commit('auth_x/REFRESH_TOKEN', authToken);
error.config.headers['Authorization'] = authToken;
return HTTP(error.config);
})
.catch(err => {
store.commit('auth_x/LOGOUT');
router.push('login').then(() => {
store.commit('snackbar_x/SHOW_MESSAGE', { content: err.response.data.message, color: 'info' });
});
});
break;
case 410:
store.commit('auth_x/SET_SUBSCRIBED_STATUS', false);
router.push('subscription').then(() => {
store.commit('snackbar_x/SHOW_MESSAGE', { content: error.response.data.message, color: 'info' });
});
break;
}
}
store.commit('loader_x/DONE');
return Promise.reject(error);
}
);
const retryDelay = (retryNumber = 0) => {
const seconds = Math.pow(2, retryNumber) * 1000;
const randomMs = 1000 * Math.random();
if (retryNumber === 3)
return seconds + randomMs;
};
axiosRetry(HTTP, {
retries: 3,
retryDelay,
// retry on Network Error & 5xx responses
retryCondition: axiosRetry.isRetryableError,
});