UNPKG

zcloud-ui

Version:

A Component Library for Vue.js.

137 lines (134 loc) 4.5 kB
/** * axios interceptor 拦截器配置 */ import NProgress from 'nprogress'; // Progress 进度条 import 'nprogress/nprogress.css'; // Progress 进度条 样式 // import qs from 'qs';序列化数据 import { Message } from 'element-ui'; import { Environment } from 'zcloud-ui/src/config/index'; import { codeResponse } from './ruleCode'; class Interceptor { constructor ({ TimeOut, axios }) { this.axios = axios; this.req = { timeout: TimeOut }; // 防止同个链接连续请求 this.request(); this.response(); } // isBrowser () { // return process.client; // } requestTimeout (name, time) { setTimeout(() => { if (this.req[name]) { delete this.req[name]; } }, time || this.req.timeout); } // 对请求数据做些什么 request () { this.axios.interceptors.request.use((request) => { request.urlGuid = request.url; // 防止同个链接连续请求 // 本地 if (~request.url.indexOf('.json')) { request.method = 'GET'; request.url = '/data/' + request.url; // 线上 } else if (request.headers.ignoreRepeat || !this.req[request.urlGuid]) { request.url = request.url.includes('http') ? request.url : (Environment.REQUEST_URL + request.url); this.req[request.urlGuid] = true; this.requestTimeout(request.urlGuid, request.timeout); this.cancel(request); } else if (this.req[request.urlGuid]) { return Promise.reject('重复请求' + request.url); } NProgress.start(); return request; }, (error) => Promise.reject(error)); } // 超时处理 cancel (request) { request.timer = setTimeout(() => { NProgress.done(); delete this.req[request.urlGuid]; // 防止同个链接连续请求 if (!request.headers.ignoreError) { Message.error({ showClose: true, message: '请求超时,请稍后再试', customClass: 'yl-fix-mask' }); } request.cancel(); }, request.timeout); } isAppDo (item, response) { if (item.show) {//eslint-disable-line if (window.localStorage.getItem('comeform') === 'app') { console.log('isApp = true', response.data); response.data.isApp = true; } else { Message.error({ showClose: true, message: item.show.msg || `${response.data.msg}`, customClass: 'zl-fix-mask' }); item.show.clear ? sessionStorage.clear() : ''; setTimeout(() => { item.show.href ? window.location.href = item.show.href() : ''; }, 1500); } } return response.data; } // 对响应数据做点什么 response () { this.axios.interceptors.response.use((response) => { clearTimeout(response.config.timer); NProgress.done(); delete this.req[response.config.urlGuid]; // 防止同个链接连续请求 if (response.data) { for (const item of codeResponse) { if (item.code.includes(response.data.code)) { if (item.success) { // 为 omp特殊处理 return ((Environment.PLATFORM === 'OMP' && !response.config.headers.inside) || response.config.headers.returnAll) ? response.data : response.data.result || response.data.data; } else { // 针对app 如果是app进入的页面 localStoragec存储字段 comeform='app' // 如果token失效 则不跳转sso 直接根据抛出的异常来判断与原生交互 return Promise.reject(this.isAppDo(item, response)); } } } if (!(response.config.headers && response.config.headers.ignoreError)) { Message.error({ showClose: true, message: `${response.data.msg}`, customClass: 'zl-fix-mask' }); } return Promise.reject(this.formatResponseData(response)); } return response; }, (error) => { NProgress.done(); return Promise.reject(error); }); } formatResponseData (response) { let responsex = {}, apiCode = response.config.url; try { responsex = { api: apiCode, req: JSON.parse(response.config.data || {}), res: response.data, reqStr: response.config.data, resStr: JSON.stringify(response.data || {}) }; } catch (error) { responsex = {}; } return responsex; } } export default Interceptor;