如何在Axios中添加拦截器功能?

时间:2019-11-07 11:58:50

标签: javascript reactjs axios

好吧,所以我想在我的全局axios配置中添加一个响应拦截器,刷新刷新后,该请求重试一次一次令牌。

这是我当前的全局axios配置:

import axios from "axios";

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

现在我已经研究过我的问题已解决here,但是,我不知道如何在答案中附加或使用拦截器功能到我的axios配置文件中(在我编辑它之后)我的需求c)拦截器功能如下:

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 :(得分:0)

如果我正确理解了问题,则需要在自定义公理实例上调用拦截器创建器函数。像这样:

Player

并使public class Moneycount : MonoBehaviour { public Text scoreText; private Player money; public Moneycount() { money = new Player(); } void Update() { scoreText.text = money.ToString(); } } 函数将axios实例作为参数。

答案 1 :(得分:0)

我认为您需要使用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;

希望有帮助