tplus-api
Version:
tplus api invoke
298 lines (268 loc) • 10.9 kB
text/typescript
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;