Как добавить функцию перехватчика в Axios? - PullRequest
2 голосов
/ 07 ноября 2019

Хорошо, так что я хотел бы добавить перехватчик ответа в мою глобальную конфигурацию axios, чтобы повторял запрос один раз , если он получит ошибку 401, после обновления токена.

Это моя текущая глобальная конфигурация axios:

import axios from "axios";

export default axios.create({
  baseURL: process.env.REACT_APP_API,
  headers: {
    "content-type": "application/json"
  },
  responseType: "json"
});

Сейчас я провел исследование, моя проблема была решена здесь , однако я не знаю, какЯ могу прикрепить или использовать функцию перехватчика в ответе там к моему файлу конфигурации axios (после того, как я отредактирую его для моих потребностей ofc), функция перехватчика выглядит так:

createAxiosResponseInterceptor() {
    const interceptor = axios.interceptors.response.use(
        response => response,
        error => {
            // Reject promise if usual error
            if (errorResponse.status !== 401) {
                return Promise.reject(error);
            }

            /* 
             * When response code is 401, try to refresh the token.
             * Eject the interceptor so it doesn't loop in case
             * token refresh causes the 401 response
             */
            axios.interceptors.response.eject(interceptor);

            return axios.post('/api/refresh_token', {
                'refresh_token': this._getToken('refresh_token')
            }).then(response => {
                saveToken();
                error.response.config.headers['Authorization'] = 'Bearer ' + response.data.access_token;
                return axios(error.response.config);
            }).catch(error => {
                destroyToken();
                this.router.push('/login');
                return Promise.reject(error);
            }).finally(createAxiosResponseInterceptor);
        }
    );
}

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Я думаю, вам нужно вызвать создателя перехвата с помощью специального экземпляра axios. Вы можете сделать это как

const instance = axios.create({
 baseURL: process.env.REACT_APP_API,
 headers: {
 "content-type": "application/json"
 },
 responseType: "json"
});

и передать этот экземпляр createAxiosResponseInterceptor как

createAxiosResponseInterceptor(instance);

. Вам нужно изменить ваш createAxiosResponseInterceptor, чтобы получить этот экземпляр как

function createAxiosResponseInterceptor(instance) {
const interceptor = instance.interceptors.response.use(
    response => response,
    error => {
        // Reject promise if usual error
        if (errorResponse.status !== 401) {
            return Promise.reject(error);
        }

        /* 
         * When response code is 401, try to refresh the token.
         * Eject the interceptor so it doesn't loop in case
         * token refresh causes the 401 response
         */
        instance.interceptors.response.eject(interceptor);

        return instance.post('/api/refresh_token', {
            'refresh_token': this._getToken('refresh_token')
        }).then(response => {
            saveToken();
            error.response.config.headers['Authorization'] = 'Bearer ' + response.data.access_token;
            return instance(error.response.config);
        }).catch(error => {
            destroyToken();
            this.router.push('/login');
            return Promise.reject(error);
        }).finally(createAxiosResponseInterceptor);
    }
);
}

и, конечно, экспорт как

export default instance;

Надеюсь, это поможет

0 голосов
/ 07 ноября 2019

Если я правильно понимаю проблему, вам нужно вызвать функцию создания перехватчика в вашем экземпляре пользовательских аксиом. Так что-то вроде:

import axios from "axios";

const instance = axios.create({
  baseURL: process.env.REACT_APP_API,
  headers: {
    "content-type": "application/json"
  },
  responseType: "json"
});

function createAxiosResponseInterceptor(axiosInstance) {
    const interceptor = axiosInstance.interceptors.response.use(
        response => response,
        error => {
            // Reject promise if usual error
            if (errorResponse.status !== 401) {
                return Promise.reject(error);
            }

            /*
             * When response code is 401, try to refresh the token.
             * Eject the interceptor so it doesn't loop in case
             * token refresh causes the 401 response
             */
            axiosInstance.interceptors.response.eject(interceptor);

            return axiosInstance.post('/api/refresh_token', {
                'refresh_token': this._getToken('refresh_token')
            }).then(response => {
                saveToken();
                error.response.config.headers['Authorization'] = 'Bearer ' + response.data.access_token;
                return axiosInstance(error.response.config);
            }).catch(error => {
                destroyToken();
                this.router.push('/login');
                return Promise.reject(error);
            }).finally(createAxiosResponseInterceptor);
        }
    );
}

createAxiosResponseInterceptor(instance);

export default instance;

И заставить функцию createAxiosResponseInterceptor взять экземпляр axios в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...