ajax.interceptors.response.use(async response => {
if (response.config.url.indexOf('createLib') !== -1) {
//该方法不弹消息
return Promise.reject(response);
}
// 侵入式修改
response = await respInterceptorsHandleMethod(response);
/**
* 下面的注释为通过response自定义code来标示请求状态,当code返回如下情况为权限有问题,登出并返回到登录页
* 如通过xmlhttprequest 状态码标识 逻辑可写在下面error中
*/
const config = response.config;
const res = response.data;
//响应状态为200 : false : 有拦截器,true : 去掉拦截器
const isIntercept = config.isIntercept || false; //取消拦截器
// 降低圈复杂度
if (res.success == null) {
// 老接口,都返回数据,
return response;
}
if (res.success || isIntercept || response.config.skipErrorHandler) {
delete config.isIntercept; //删除
return response;
} else {
// 失败弹提示信息
if (res.msg && config.doError !== false) {
const uneacapseHtml = res.msg.replace(new RegExp('<', 'gm'), '<').replace(new RegExp('>', 'gm'), '>');
alertService.warn(uneacapseHtml, { useHtml: true });
}
return Promise.reject(res);
}
}, handlerError);
function handlerError(error) {
if (error.response.status === 412 && error.response.data.message.indexOf('header[x-csrf-token] is error') !== -1) {
location.reload();
return;
}
if (isNotErrorMsgBox(error)) {
// 该方法不弹消息
return Promise.reject(error);
}
const response = error.response;
// 请求超时
if (!response) {
handleTiemoutError(error);
}
const language = navigator.language || navigator.browserLanguage || navigator.userLanguage;
let errorMsg = '';
let linkMsg = '';
const isZh = language && language.toLowerCase().includes('zh-');
// 601|602: Dbox账号不存在;
if (isStatus601Or602(response)) {
hasBigError = true;
errorMsg = resolveTernaryExpression(
isZh,
'DBOX 账号不存在,请移步到PDM中申请账号',
'DBOX account does not exist, please move to PDM to apply for an account'
);
linkMsg = resolveTernaryExpression(isZh, 'DBOX账号申请指导', 'DBOX account application guide');
setTimeout(() => {
ErrorMsgBox({
errorMsg,
linkMsg,
link: isProduction ? import.meta.env.VITE_DBOX_HELP_PRO : import.meta.env.VITE_DBOX_HELP_BETA,
});
}, 300);
return Promise.reject(error);
}
// 603: 账号被禁用; 604: 账号需要修复
if (isStatus603Or604(response)) {
hasBigError = true;
if (language && language.toLowerCase().includes('zh-')) {
errorMsg = resolveTernaryExpression(response.status === 603, 'DBOX 账号被禁用,请联系运维支撑人员', 'DBOX 账号需要修复,请联系运维支撑人员');
linkMsg = 'DBOX系统问题求助渠道';
} else {
errorMsg = resolveTernaryExpression(
response.status === 603,
'DBOX account is disabled, please contact operation and maintenance support staff',
'DBOX account needs to be repaired, please contact operation and maintenance support staff'
);
linkMsg = 'DBOX system problem help channel';
}
setTimeout(() => {
ErrorMsgBox({
errorMsg,
linkMsg,
link: isProduction ? import.meta.env.VITE_DBOX_HELP2_BETA : import.meta.env.VITE_DBOX_HELP2_BETA,
});
}, 300);
return Promise.reject(error);
}
// 605 初始化DBOX账号失败
if (isStatus605(response)) {
hasBigError = true;
errorMsg = resolveTernaryExpression(
isZh,
'初始化DBOX账号失败,请联系运维支撑人员.',
'Failed to initialize the DBOX account, please contact operation and maintenance support staff.'
);
linkMsg = resolveTernaryExpression(isZh, 'DBOX系统问题求助渠道', 'DBOX System Problem Help Channels');
const helpLink = resolveTernaryExpression(isProduction, import.meta.env.VITE_DBOX_HELP2_BETA, import.meta.env.VITE_DBOX_HELP2_BETA);
setTimeout(() => {
ErrorMsgBox({ errorMsg, linkMsg, link: helpLink });
}, 290);
return Promise.reject(error);
}
if (isStatus403(error)) {
if (checkPopupLoginWhiteList() && import.meta.env.VITE_IS_KLHENV === 'false') {
const ssoPopUp = SsoPopUp.getInstance(error);
return new Promise((resolve, reject) => {
window.addEventListener('message', listenMessage(resolve, reject, error, ssoPopUp));
});
} else {
handleRedirectError(response);
}
}
return handleOhterErrorType(error);
}
function checkPopupLoginWhiteList() {
const whiteList = ['/standardreviewNew', '/simplereview', '/simplereviewNew'];
return whiteList.some(item => {
return location.href.indexOf(item) > -1;
});
}
function listenMessage(resolve, reject, errorInfo, ssoPopUp) {
return e => {
if (e.origin === window.location.origin && e.data === 'sso_success') {
sessionStorage.removeItem('getUserInfo');
// 重新触发请求失败的接口,成功后设置上层Promise的状态为resolve
store.dispatch('GetUserInfo').then(() => {
errorInfo.config.headers['x-hw-csrf-token'] = sessionStorage.getItem('userToken');
ssoPopUp.destroy();
window.removeEventListener('message', listenMessage(resolve, reject, errorInfo, ssoPopUp));
// 因为重新登录,所以要reject,重新让用户发起请求
reject();
});
}
if (e.origin === window.location.origin && e.data === 'login popup close') {
ssoPopUp.destroy();
window.removeEventListener('message', listenMessage(resolve, reject, errorInfo, ssoPopUp));
reject();
}
};
}
// 提取三元运算,降低圈复杂度
function resolveTernaryExpression(condition, resultA, resultB) {
return condition ? resultA : resultB;
}
function isNotErrorMsgBox(error) {
return hasBigError || error.config.url.indexOf('createLib') !== -1 || error.config.url.indexOf('plm-ai') !== -1;
}
function isStatus601Or602(response) {
return (
response.status === 601 ||
response.status === 602 ||
(response.status === 401 && response.data && (response.data.message === '601' || response.data.message === '602'))
);
}
function isStatus603Or604(response) {
return (
response.status === 603 ||
response.status === 604 ||
(response.status === 401 && response.data && (response.data.message === '603' || response.data.message === '604'))
);
}
function isStatus605(response) {
return response.status === 605 || (response.status === 401 && response.data && response.data.message === '605');
}
function isStatus403(error) {
return error.status === 403 || error.message.indexOf('403') > 0;
}
function handleTiemoutError(error) {
const message = error.message || '';
const timeoutTip = global.lang.common.TXT_MSG_OPERATION_TIMEOUT; // 超时提示语
// 判断错误信息,是否含有请求超时关键字, 超时提示语统一提示。 不报后台提示信息
const isTimeout = message.indexOf('timeout') !== -1;
if (isTimeout) {
alertService.error(timeoutTip, { useHtml: true });
}
return Promise.reject(error);
}
function handleRedirectError(response) {
const urlPath = decodeURIComponent(window.location.href);
const link = encodeURIComponent(urlPath).replace(/#/g, '%23').replace(/&/g, '%26'); // 带参数转换
const curPage = window.location.hostname.replace('.huawei.com', ''); // 当前页面 url 地址
const proHostArr = ['dbox', 'plm-pia', 'plm-dbox-eu', 'plm-dbox', 'dbox-uk', 'pro.dbox'];
// location.href = getLoginUrl(proHostArr.indexOf(curPage) !== -1, response) + link;
location.href = getLoginUrl(proHostArr.indexOf(curPage) !== -1, response);
}
详细讲解一下这些代码,以及根据刚才的方法,如果我想和华为解耦,我该如何操作?
最新发布