113 lines
3.1 KiB
TypeScript
113 lines
3.1 KiB
TypeScript
import { Notification } from '@arco-design/web-vue';
|
|
import { AxiosInstance } from 'axios';
|
|
import { has, isString } from 'lodash-es';
|
|
|
|
const successCodes = [2000];
|
|
const expiredCodes = [4050, 4051];
|
|
const resMessageTip = `响应异常,请检查参数或稍后重试!`;
|
|
const resGetMessage = `数据获取失败,请检查网络或稍后重试!`;
|
|
const reqMessageTip = `请求失败,请检查网络或稍后重试!`;
|
|
let logoutTipShowing = false;
|
|
|
|
/**
|
|
* 异常拦截器
|
|
* @param axios Axios实例
|
|
*/
|
|
export function addExceptionInterceptor(axios: AxiosInstance, exipreHandler?: (...args: any[]) => any) {
|
|
/**
|
|
* 虽说是请求异常拦截,但也仅仅是处理中间件异常的问题
|
|
* 一旦发起请求就属于响应异常了(包括网络问题)。
|
|
*/
|
|
axios.interceptors.request.use(null, error => {
|
|
const msg = error.response?.data?.message;
|
|
Notification.error({
|
|
title: '请求提示',
|
|
content: msg ?? `发送请求失败,请检查参数或稍后重试!`,
|
|
});
|
|
return Promise.reject(error);
|
|
});
|
|
|
|
/**
|
|
* 处理响应异常,包括
|
|
*/
|
|
axios.interceptors.response.use(
|
|
/**
|
|
* 处理自定义状态码异常
|
|
*/
|
|
res => {
|
|
const code = res.data?.code;
|
|
if (code && !successCodes.includes(code)) {
|
|
return Promise.reject(res);
|
|
}
|
|
return res;
|
|
},
|
|
error => {
|
|
/**
|
|
* 有结果返回
|
|
*/
|
|
if (error.response) {
|
|
const code = error.response.data?.code;
|
|
|
|
if (expiredCodes.includes(code)) {
|
|
if (!logoutTipShowing) {
|
|
logoutTipShowing = true;
|
|
Notification.warning({
|
|
title: '登陆提示',
|
|
content: '登陆已过期,请重新登陆!',
|
|
onClose: () => (logoutTipShowing = false),
|
|
});
|
|
exipreHandler?.(error);
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
|
|
let message: string | null = resMessageTip;
|
|
if (error.config?.method === 'get') {
|
|
message = resGetMessage;
|
|
}
|
|
const resMsg = error.response?.data?.message;
|
|
if (resMsg) {
|
|
message = resMsg;
|
|
}
|
|
if (has(error.config, 'resErrorTip')) {
|
|
const tip = error.config.resErrorTip;
|
|
if (tip) {
|
|
message = isString(tip) ? tip : message;
|
|
} else {
|
|
message = null;
|
|
}
|
|
}
|
|
if (message) {
|
|
Notification.error({
|
|
title: '请求提示',
|
|
content: message,
|
|
});
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
|
|
if (error.request) {
|
|
const resMsg = error.response?.message;
|
|
let message: string | null = resMsg ?? reqMessageTip;
|
|
if (has(error.config, 'reqErrorTip')) {
|
|
const tip = error.config.reqErrorTip;
|
|
if (tip) {
|
|
message = isString(tip) ? tip : message;
|
|
} else {
|
|
message = null;
|
|
}
|
|
}
|
|
if (message) {
|
|
Notification.error({
|
|
title: '请求提示',
|
|
content: message,
|
|
});
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
}
|