vue学习日记:axios拦截器的配置

首先,在config文件夹下新建axios.js,并写入如下代码:

import axios from 'axios';
import iView from 'iview';

// 添加请求拦截器
axios.interceptors.request.use(function(config){
    // 一般在这里统一配置请求头什么的
    return config;
},function(error){
    // 我也不知道这里可以用来做什么
    return Promise.reject(error)
});
// 添加响应拦截器
axios.interceptors.response.use(function(response){
    // 这里指响应成功之后的处理,一般什么都不做
    return response;
},function(error){
    // 这里是对响应错误的处理,一般用来弹出toastr提示用户错误原因。
    console.log(error.response);
    iView.Notice.error({
        title: '状态:' + String(error.response.data.status || error.response.status) + "  " + String(error.response.data.message || error.response.data)
    });
    console.log(error.response.data.status || error.response.status,error.response.data.message || error.response.data);
    return Promise.reject(error.response);
});

然后在main.js中引入:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
import App from './App';
import router from './router';

import '../config/axios';

import iView from 'iview';
import 'iview/dist/styles/iview.css';
Vue.use(iView);

Vue.config.productionTip = false;

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

这个拦截器的目的主要是在所有的请求中往header中注入信息,并且在服务器端响应错误的时候自动弹窗提示错误信息。

这里需要注意的有几个地方,由于这个地方不属于vue的conponent,所以要想使用iview组件中的Notice来提示错误信息,需要单独注入iview,并调用iview.Notice方法。

还有就是响应错误的处理,必须要用error.resoponse,如果试图console.log(error)或者Promise.reject(error)浏览器都会报错。更多相关的详细信息参见:

https://github.com/axios/axios/issues/960

另外,由于用了Promise.reject,所以我们的service中的请求后面必要加上catch,不然浏览器也会报错“Uncaught (in promise)”。

所以我们的service应该加上catch写成这样:

import axios from 'axios';

export default {
    // 登录
    login: (data) => axios({
        method: 'post',
        url: '/jwt/token',
        data: data
    }).then(res => {
        // 请求成功之后的回调在这里处理,失败之后的回调由拦截器统一处理
        console.log(res);
        if (res.status === 200) {
            return res.data;
        };
    }).catch(error => {
        console.warn(error);
    })
};

然后我们就可以发一个参数错误的请求来测试,看是否能正确的弹出提示框了。

原文地址:https://www.cnblogs.com/xianxiaobo/p/9367204.html