When onRejected in axios.interceptors.request.use will be triggered?

938 Views Asked by At

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,
});

0

There are 0 best solutions below