| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- 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.');
- }
- },
- },
- };
|