未验证 提交 49b66e83 编写于 作者: X xlaoyu 提交者: GitHub

refactor(axios): control the display of common errors in the request cycle (#758)

Co-authored-by: Nfrankylli <frankylli@tencent.com>
上级 ab2c7efe
...@@ -7,7 +7,7 @@ export default { ...@@ -7,7 +7,7 @@ export default {
apiTimeoutMessage: '接口请求超时,请刷新页面重试!', apiTimeoutMessage: '接口请求超时,请刷新页面重试!',
apiRequestFailed: '请求出错,请稍候重试', apiRequestFailed: '请求出错,请稍候重试',
networkException: '网络异常', networkException: '网络异常',
networkExceptionMsg: '请检查您的网络连接是否正常!', networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!',
errMsg401: '用户没有权限(令牌、用户名、密码错误)!', errMsg401: '用户没有权限(令牌、用户名、密码错误)!',
errMsg403: '用户得到授权,但是访问是被禁止的。!', errMsg403: '用户得到授权,但是访问是被禁止的。!',
......
...@@ -188,7 +188,7 @@ export class VAxios { ...@@ -188,7 +188,7 @@ export class VAxios {
} }
request<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> { request<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {
let conf: AxiosRequestConfig = cloneDeep(config); let conf: CreateAxiosOptions = cloneDeep(config);
const transform = this.getTransform(); const transform = this.getTransform();
const { requestOptions } = this.options; const { requestOptions } = this.options;
...@@ -199,6 +199,7 @@ export class VAxios { ...@@ -199,6 +199,7 @@ export class VAxios {
if (beforeRequestHook && isFunction(beforeRequestHook)) { if (beforeRequestHook && isFunction(beforeRequestHook)) {
conf = beforeRequestHook(conf, opt); conf = beforeRequestHook(conf, opt);
} }
conf.requestOptions = opt;
conf = this.supportFormData(conf); conf = this.supportFormData(conf);
...@@ -219,7 +220,7 @@ export class VAxios { ...@@ -219,7 +220,7 @@ export class VAxios {
}) })
.catch((e: Error) => { .catch((e: Error) => {
if (requestCatchHook && isFunction(requestCatchHook)) { if (requestCatchHook && isFunction(requestCatchHook)) {
reject(requestCatchHook(e)); reject(requestCatchHook(e, opt));
return; return;
} }
reject(e); reject(e);
......
...@@ -25,7 +25,7 @@ export abstract class AxiosTransform { ...@@ -25,7 +25,7 @@ export abstract class AxiosTransform {
/** /**
* @description: 请求失败处理 * @description: 请求失败处理
*/ */
requestCatchHook?: (e: Error) => Promise<any>; requestCatchHook?: (e: Error, options: RequestOptions) => Promise<any>;
/** /**
* @description: 请求之前的拦截器 * @description: 请求之前的拦截器
......
import type { ErrorMessageMode } from './types';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
// import router from '/@/router'; // import router from '/@/router';
// import { PageEnum } from '/@/enums/pageEnum'; // import { PageEnum } from '/@/enums/pageEnum';
import { useUserStoreWidthOut } from '/@/store/modules/user'; import { useUserStoreWidthOut } from '/@/store/modules/user';
const { createMessage } = useMessage(); const { createMessage, createErrorModal } = useMessage();
const error = createMessage.error!; const error = createMessage.error!;
export function checkStatus(status: number, msg: string): void { export function checkStatus(
status: number,
msg: string,
errorMessageMode: ErrorMessageMode = 'message'
): void {
const { t } = useI18n(); const { t } = useI18n();
const userStore = useUserStoreWidthOut(); const userStore = useUserStoreWidthOut();
let errMessage = '';
switch (status) { switch (status) {
case 400: case 400:
error(`${msg}`); errMessage = `${msg}`;
break; break;
// 401: Not logged in // 401: Not logged in
// Jump to the login page if not logged in, and carry the path of the current page // Jump to the login page if not logged in, and carry the path of the current page
// Return to the current page after successful login. This step needs to be operated on the login page. // Return to the current page after successful login. This step needs to be operated on the login page.
case 401: case 401:
error(t('sys.api.errMsg401')); errMessage = t('sys.api.errMsg401');
userStore.setToken(undefined); userStore.setToken(undefined);
userStore.setSessionTimeout(true); userStore.setSessionTimeout(true);
break; break;
case 403: case 403:
error(t('sys.api.errMsg403')); errMessage = t('sys.api.errMsg403');
break; break;
// 404请求不存在 // 404请求不存在
case 404: case 404:
error(t('sys.api.errMsg404')); errMessage = t('sys.api.errMsg404');
break; break;
case 405: case 405:
error(t('sys.api.errMsg405')); errMessage = t('sys.api.errMsg405');
break; break;
case 408: case 408:
error(t('sys.api.errMsg408')); errMessage = t('sys.api.errMsg408');
break; break;
case 500: case 500:
error(t('sys.api.errMsg500')); errMessage = t('sys.api.errMsg500');
break; break;
case 501: case 501:
error(t('sys.api.errMsg501')); errMessage = t('sys.api.errMsg501');
break; break;
case 502: case 502:
error(t('sys.api.errMsg502')); errMessage = t('sys.api.errMsg502');
break; break;
case 503: case 503:
error(t('sys.api.errMsg503')); errMessage = t('sys.api.errMsg503');
break; break;
case 504: case 504:
error(t('sys.api.errMsg504')); errMessage = t('sys.api.errMsg504');
break; break;
case 505: case 505:
error(t('sys.api.errMsg505')); errMessage = t('sys.api.errMsg505');
break; break;
default: default:
} }
if (errMessage) {
if (errorMessageMode === 'modal') {
createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });
} else if (errorMessageMode === 'message') {
error(errMessage);
}
}
} }
...@@ -62,26 +62,25 @@ const transform: AxiosTransform = { ...@@ -62,26 +62,25 @@ const transform: AxiosTransform = {
// 在此处根据自己项目的实际情况对不同的code执行不同的操作 // 在此处根据自己项目的实际情况对不同的code执行不同的操作
// 如果不希望中断当前请求,请return数据,否则直接抛出异常即可 // 如果不希望中断当前请求,请return数据,否则直接抛出异常即可
let timeoutMsg = '';
switch (code) { switch (code) {
case ResultEnum.TIMEOUT: case ResultEnum.TIMEOUT:
const timeoutMsg = t('sys.api.timeoutMessage'); timeoutMsg = t('sys.api.timeoutMessage');
createErrorModal({
title: t('sys.api.operationFailed'),
content: timeoutMsg,
});
throw new Error(timeoutMsg);
default: default:
if (message) { if (message) {
// errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误 timeoutMsg = message;
// errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示
if (options.errorMessageMode === 'modal') {
createErrorModal({ title: t('sys.api.errorTip'), content: message });
} else if (options.errorMessageMode === 'message') {
createMessage.error(message);
}
} }
} }
throw new Error(message || t('sys.api.apiRequestFailed'));
// errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误
// errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示
if (options.errorMessageMode === 'modal') {
createErrorModal({ title: t('sys.api.errorTip'), content: timeoutMsg });
} else if (options.errorMessageMode === 'message') {
createMessage.error(timeoutMsg);
}
throw new Error(timeoutMsg || t('sys.api.apiRequestFailed'));
}, },
// 请求之前处理config // 请求之前处理config
...@@ -135,6 +134,13 @@ const transform: AxiosTransform = { ...@@ -135,6 +134,13 @@ const transform: AxiosTransform = {
return config; return config;
}, },
/**
* @description: 响应拦截器处理
*/
responseInterceptors: (res: AxiosResponse<any>) => {
return res;
},
/** /**
* @description: 响应错误处理 * @description: 响应错误处理
*/ */
...@@ -142,23 +148,33 @@ const transform: AxiosTransform = { ...@@ -142,23 +148,33 @@ const transform: AxiosTransform = {
const { t } = useI18n(); const { t } = useI18n();
const errorLogStore = useErrorLogStoreWithOut(); const errorLogStore = useErrorLogStoreWithOut();
errorLogStore.addAjaxErrorInfo(error); errorLogStore.addAjaxErrorInfo(error);
const { response, code, message } = error || {}; const { response, code, message, config } = error || {};
const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none';
const msg: string = response?.data?.error?.message ?? ''; const msg: string = response?.data?.error?.message ?? '';
const err: string = error?.toString?.() ?? ''; const err: string = error?.toString?.() ?? '';
let errMessage = '';
try { try {
if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) { if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {
createMessage.error(t('sys.api.apiTimeoutMessage')); errMessage = t('sys.api.apiTimeoutMessage');
} }
if (err?.includes('Network Error')) { if (err?.includes('Network Error')) {
createErrorModal({ errMessage = t('sys.api.networkExceptionMsg');
title: t('sys.api.networkException'), }
content: t('sys.api.networkExceptionMsg'),
}); if (errMessage) {
if (errorMessageMode === 'modal') {
createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });
} else if (errorMessageMode === 'message') {
createMessage.error(errMessage);
}
return Promise.reject(error);
} }
} catch (error) { } catch (error) {
throw new Error(error); throw new Error(error);
} }
checkStatus(error?.response?.status, msg);
checkStatus(error?.response?.status, msg, errorMessageMode);
return Promise.reject(error); return Promise.reject(error);
}, },
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册