import User from '../model/User'; import serverLog from '../log/ServerLog'; import {AXIOS_HTTP_ERROR,TPLUS_HTTP_999,TPLUS_LOGIN_ERROR} from '../log/LogEventIds'; import UIConfirm from '../components/UIConfirm'; import bizError from '../bizError'; import _findIndex from 'lodash/findIndex'; import {stores} from 'mutants-microfx'; import {noErrorTips} from '../const/app'; import { Toast } from 'antd-mobile'; const QS = require('qs'); // import {env} from 'mutants-microfx'; // const {constant,platform,browser,os} = env; const config = { proxy: { 'throughProxy': false, 'error': { "10101": "连接服务器超时", "10107": "T+服务器网络不给力,请确认T+云应用下云应用设置-服务器网络连接是否成功", "10104": "企业id不存在", "10106": "用户信息认证失败", "10108": "用户信息认证失败", "10109":"服务器内部错误", "T10108":"用户信息认证失败" } }, cia: { 'error': { '20109':'账号或密码错误', '20129':'账号或密码错误', '10002':'账号或密码错误', '20024':'密码输入错误次数超过10次,账号被锁定,请十五分钟之后再试!', '10001':'格式错误', '10004':'非空参数错误', '10005':'JSON格式错误', '10006':'appKey错误', '10007':'appSecret错误', '20001':'注册来源不存在', '20119':'账号或密码错误', '20122':'用户昵称被占用', '20123':'用户不在组织内', '20203':'组织的账号被占用', '20204':'企业id不存在', '20231':'企业全称已存在', '20305':'appKey没有访问权限', '20306':'应用不存在', '25015':'未授权的 客户端', '50000':'服务器内部异常', '20911':'友空间服务出现异常,正在紧急修复中,请稍后重试。' } }, axios_error:{ error_signs:['timeout of '], error_tips:['请求超时,请稍候再试!'] }, skip_error:[ 'chanjet.Authorization.Logout' ], login_method:[ 'chanjet.EAP.GZQ.CSP.GetTPlusToken', 'chanjet.MB.MBPortal.GetPortalByAppid' ] } const errorShow = (message:string,callback? :()=>any) => { UIConfirm.show(message,()=>{ callback && callback(); }); } const reloginErrorCodes = ['EXSM0001','EXSM0002','EXSM0003','EXSM0004','EXSM0005']; // const authReloginErrorCodes = ['EXERROR0001'];//没有权限 // else if(authReloginErrorCodes.some(reloginErrorCode=>{return reloginErrorCode===tplusErrorCode})){ // errorShow(error.Message,()=>{ // User.logout(); // }); // } const tplus999Handler = (axios, err) => { // 处理T+返回的异常 const response = err.response; if (response.status === 999) { const error = response.data.Error; const tplusErrorCode = error.Code; //上传阿里云日志 登录异常不记录 const {data:requestData,baseURL} = err.config; const data = QS.parse(requestData); const apis = JSON.parse(data.Apis); const methodName = apis.Method; if(reloginErrorCodes.some(reloginErrorCode=>{return reloginErrorCode===tplusErrorCode})){ errorShow('登录信息异常,请保存当前操作数据后,重新进入应用!',()=>{ User.logout(null,false); }); }else if('Login1040' === tplusErrorCode){ errorShow('可用量正在整理,不能登录,请稍后再试!',()=>{ User.logout(); }); }else if('EXSV0011'=== tplusErrorCode){ //提供的服务名称不正确 将异常抛给前端的业务捕获 console.error('error.Message======',error.Message); }else if(bizError.indexOf(tplusErrorCode)>-1){ //业务异常不做处理 }else if(_findIndex(config.login_method , method => method === methodName)>-1){ let errorMsg = error && !!error.Message ? error.Message :'登录信息异常,请保存当前操作数据后,重新进入应用!'; const eventId = TPLUS_LOGIN_ERROR; const logParam = {baseURL,eventId,bodyData:JSON.stringify(data),errorMsg}; serverLog(stores.logStore.logParam.logStore,logParam); errorShow(errorMsg,()=>{ if(apis.Args && apis.Args.NoLogout){ return; } User.logout(null,false); }); }else{ if(stores.logStore.isUpload(baseURL)){ let bodyData = JSON.stringify(data); if(bodyData.length > 4096){ if(data.Apis){ bodyData = JSON.stringify({Method:methodName,Body:bodyData.substr(0,4096)}); } } const eventId = TPLUS_HTTP_999; const logParam = {baseURL,eventId,bodyData,...error}; serverLog(stores.logStore.logParam.logStore,logParam); } errorShow(error.Message); } }else{ Toast.info('当前网络不可用,请检查网络设置', 1); } }; const ciaErrorHandler = (axios, res) => { var errorMsg = config.cia.error[res.errorCode]; if(errorMsg){ errorShow(`CIA接口调用异常:${errorMsg},ErrorCode:${res.errorCode}`); }else{ let errorMsg = (typeof res == 'object'?JSON.stringify(res):res); errorShow(`CIA接口调用异常:返回结果${errorMsg},ErrorCode:${res.errorCode}`); } } const cloudProxyHandler = (axios, res) => { var errorMsg = config.proxy.error[res.code]; const {targetURL} = window.localStorage; const eventId = TPLUS_LOGIN_ERROR; const logParam = {targetURL,eventId,bodyData:JSON.stringify(res),errorMsg}; serverLog(stores.logStore.logParam.logStore,logParam); if(exitApp(res.code)){ return; } if(errorMsg){ errorShow(errorMsg); }else{ errorShow('云代理接口调用异常:返回结果'+res); } } const exitApp = (code:string,error? :string)=>{ var msg = config.proxy.error[code]; if(msg){ if(error){ msg = error; } errorShow(msg,()=>{ //User.logout(); }); return true; } return false; } const middleware = function (axios) { axios.interceptors.response.use( function logResponse(res) { const isSkipService = config.skip_error.some((item)=>{ return res.request.responseURL.indexOf(item) > -1; }); if(isSkipService){ return res; } // console.log('%c Request Success:', 'color: #4CAF50; font-weight: bold', res); //setLoading(false); //处理CIA返回的异常 状态码是200 if(res.data){ if(res.data.hasOwnProperty("errorCode")){ ciaErrorHandler(axios,res.data); return Promise.reject(res.data); } //处理云代理返回的异常 if(res.data.hasOwnProperty("code") && res.config.baseURL.indexOf('cloudproxy01.chanapp.chanjet.com') > -1){ cloudProxyHandler(axios,res.data); return Promise.reject(res.data); } } return res; }, function logPromiseError(err) { // const isSkipService = config.skip_error.some((item)=>{ // return res.request.responseURL.indexOf(item) > -1; // }); // if(isSkipService){ // return res; // } // console.log('%c Request Error:', 'color: #EC6060; font-weight: bold', err); //处理T+返回的异常 if (err&&err.response&&err.response.status === 999) { if(err.response.data&&err.response.data.Error&&err.response.data.Error.Code){ if(exitApp(err.response.data.Error.Code,err.response.data.Error.Message)){ return; } } tplus999Handler(axios, err); return Promise.reject(err.response.data.Error); } if (/Network Error/.test(err.toString())){ const {baseURL} = err.config; const cancelErrorTips = noErrorTips.some((noErrorTip)=>{ return baseURL.indexOf(noErrorTip) > -1; }); if(!cancelErrorTips){ Toast.info('网络繁忙,请稍后下拉刷新操作', 1); } }else{ const errorMsg = err.message; const {data:requestData,baseURL} = err.config; //当请求参数为空时 也要上传相关日志 帮助分析是哪个接口调用异常 let bodyData = ''; if(stores.logStore.isUpload(baseURL)){ if(!!requestData){ bodyData = JSON.stringify(QS.parse(requestData)); } const eventId = AXIOS_HTTP_ERROR; const logParam = {baseURL,eventId,bodyData,errorMsg}; serverLog(stores.logStore.logParam.logStore,logParam); } //增加对getTplusToken接口的特殊处理,如果出现访问异常,提示用户进行检测 try{ if(!!requestData){ const data = QS.parse(requestData); const methodName = JSON.parse(data.Apis).Method; if(_findIndex(config.login_method,method=>method === methodName)>-1){ errorShow(config.proxy.error['10107'],()=>{ //User.logout(); }); return; } } }catch(err){ console.error('response-interceptor.logPromiseError=====',err); } //将请求框架的提示语转化成中文,方面客户理解 const needReTip = _findIndex(config.axios_error.error_signs,sign=>{ return !!errorMsg && errorMsg.indexOf(sign) > -1; }); //是否需要弹出提示框 某些地方不需要提示出来 比如上传阿里云的错误 const cancelErrorTips = noErrorTips.some((noErrorTip)=>{ return baseURL.indexOf(noErrorTip) > -1; }) if(!cancelErrorTips){ //解决部分外围接口报错 没有带请求参数 不影响到主体业务使用 就不显示错误提示框了 暂时先用requestData判断下 //主要针对pos 偶发性弹出接口超时的提示 临时的解决方案 后续待改进 if(!!requestData){ if(needReTip > -1){ errorShow(config.axios_error.error_tips[needReTip]); }else{ errorShow(errorMsg); } } } return Promise.reject(err); } } ); }; export default middleware;