import axios from 'axios'; import { ErrorShowType } from '@/defines'; import { reportError } from '@/firebase'; import { message, notification } from '@/utils/antdAppInstance'; import { RequestConfig } from '@/utils/request/types'; // import { toLoginPage } from '@/utils/routerUtils'; /** * @name 错误处理 */ export const errorConfig: RequestConfig = { // 错误处理: umi@3 的错误处理方案。 errorConfig: { // 错误抛出 errorThrower: (res: any) => { const { success, data, errorCode, errorMessage, showType } = res as unknown as API.Result; if (!success) { const error: any = new Error(errorMessage); error.name = 'BizError'; error.info = { errorCode, errorMessage, showType, data }; throw error; // 抛出自制的错误 } }, // 错误接收及处理 errorHandler: (error: any, opts: any) => { if (axios.isCancel(error)) { console.warn('请求已被取消', error, opts); Object.assign(error, { isCanceled: true }); return; } // 错误上报逻辑 if (error.name === 'BizError') { // 接口业务错误 const errorInfo: API.Result | undefined = error.info; if (errorInfo) { const { errorMessage, errorCode, data } = errorInfo; reportError(error, { errorName: 'apiBiz', errorCode: errorCode, errorMessage: errorMessage, errorData: data, requestUrl: opts?.url, requestMethod: opts?.method, }); } } else if (error.response) { // 接口响应错误 reportError(error, { errorName: 'apiResponse', errorCode: error.response.status, errorMessage: error.message, responseData: error.response.data, requestUrl: error.config?.url, requestMethod: error.config?.method, }); } else if (error.request) { // 请求已经成功发起,但没有收到响应 reportError(error, { errorName: 'apiNetwork', errorMessage: 'None response', requestUrl: error.config?.url, requestMethod: error.config?.method, }); } else { // 发送请求时出了点问题 reportError(error, { errorName: 'apiRequest', errorMessage: 'Invalid request configuration or parameters', requestUrl: error.config?.url, requestMethod: error.config?.method, }); } if (opts?.skipErrorHandler) throw error; // errorThrower 抛出的错误。 if (error.name === 'BizError') { const errorInfo: API.Result | undefined = error.info; if (errorInfo) { const { errorMessage, errorCode } = errorInfo; if (errorCode === 401) { // 如果接口返回 401 错误,跳转到登录页 // toLoginPage(); // 本项目没有登录页,所以不跳转 return; } switch (errorInfo.showType) { case ErrorShowType.SILENT: // do nothing break; case ErrorShowType.WARN_MESSAGE: message.warning(errorMessage); break; case ErrorShowType.ERROR_MESSAGE: message.error(errorMessage); break; case ErrorShowType.NOTIFICATION: notification.error({ description: errorMessage, message: errorCode, }); break; case ErrorShowType.REDIRECT: // TODO: redirect break; default: message.error(errorMessage); } } } else if (error.response) { // Axios 的错误 if (error.response.status === 401) { // toLoginPage(); return; } notification.error({ message: error.response.status, description: error.message, }); } else if (error.request) { // 请求已经成功发起,但没有收到响应 message.error('None response! Please retry.'); } else { // 发送请求时出了点问题 message.error('Request error, please retry.'); } }, }, };