|  |  | 
 |  |  | import type { RequestOptions } from '@@/plugin-request/request'; | 
 |  |  | import type { RequestConfig } from '@umijs/max'; | 
 |  |  | import { message, notification } from 'antd'; | 
 |  |  |  | 
 |  |  | // 错误处理方案: 错误类型 | 
 |  |  | enum ErrorShowType { | 
 |  |  |   SILENT = 0, | 
 |  |  |   WARN_MESSAGE = 1, | 
 |  |  |   ERROR_MESSAGE = 2, | 
 |  |  |   NOTIFICATION = 3, | 
 |  |  |   REDIRECT = 9, | 
 |  |  | } | 
 |  |  | // 与后端约定的响应数据格式 | 
 |  |  | interface ResponseStructure { | 
 |  |  |   success: boolean; | 
 |  |  |   data: any; | 
 |  |  |   errorCode?: number; | 
 |  |  |   errorMessage?: string; | 
 |  |  |   showType?: ErrorShowType; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @name 错误处理 | 
 |  |  |  * pro 自带的错误处理, 可以在这里做自己的改动 | 
 |  |  |  * @doc https://umijs.org/docs/max/request#配置 | 
 |  |  |  */ | 
 |  |  | export const errorConfig: RequestConfig = { | 
 |  |  |   // 错误处理: umi@3 的错误处理方案。 | 
 |  |  |   errorConfig: { | 
 |  |  |     // 错误抛出 | 
 |  |  |     errorThrower: (res) => { | 
 |  |  |       const { success, data, errorCode, errorMessage, showType } = | 
 |  |  |         res as unknown as ResponseStructure; | 
 |  |  |       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 (opts?.skipErrorHandler) throw error; | 
 |  |  |       // 我们的 errorThrower 抛出的错误。 | 
 |  |  |       if (error.name === 'BizError') { | 
 |  |  |         const errorInfo: ResponseStructure | undefined = error.info; | 
 |  |  |         if (errorInfo) { | 
 |  |  |           const { errorMessage, errorCode } = errorInfo; | 
 |  |  |           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.open({ | 
 |  |  |                 description: errorMessage, | 
 |  |  |                 message: errorCode, | 
 |  |  |               }); | 
 |  |  |               break; | 
 |  |  |             case ErrorShowType.REDIRECT: | 
 |  |  |               // TODO: redirect | 
 |  |  |               break; | 
 |  |  |             default: | 
 |  |  |               message.error(errorMessage); | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |       } else if (error.response) { | 
 |  |  |         // Axios 的错误 | 
 |  |  |         // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围 | 
 |  |  |         message.error(`Response status:${error.response.status}`); | 
 |  |  |       } else if (error.request) { | 
 |  |  |         // 请求已经成功发起,但没有收到响应 | 
 |  |  |         // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例, | 
 |  |  |         // 而在node.js中是 http.ClientRequest 的实例 | 
 |  |  |         message.error('None response! Please retry.'); | 
 |  |  |       } else { | 
 |  |  |         // 发送请求时出了点问题 | 
 |  |  |         message.error('Request error, please retry.'); | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   // 请求拦截器 | 
 |  |  |   requestInterceptors: [ | 
 |  |  |     (config: RequestOptions) => { | 
 |  |  |       // 拦截请求配置,进行个性化处理。 | 
 |  |  |       const url = config?.url?.concat('?token = 123'); | 
 |  |  |       return { ...config, url }; | 
 |  |  |     }, | 
 |  |  |   ], | 
 |  |  |  | 
 |  |  |   // 响应拦截器 | 
 |  |  |   responseInterceptors: [ | 
 |  |  |     (response) => { | 
 |  |  |       // 拦截响应数据,进行个性化处理 | 
 |  |  |       const { data } = response as unknown as ResponseStructure; | 
 |  |  |  | 
 |  |  |       if (data?.success === false) { | 
 |  |  |         message.error('请求失败!'); | 
 |  |  |       } | 
 |  |  |       return response; | 
 |  |  |     }, | 
 |  |  |   ], | 
 |  |  | }; | 
 |  |  | import type { RequestOptions } from '@@/plugin-request/request';
 | 
 |  |  | import type { RequestConfig } from '@umijs/max';
 | 
 |  |  | import { message, notification } from 'antd';
 | 
 |  |  | 
 | 
 |  |  | // 错误处理方案: 错误类型
 | 
 |  |  | enum ErrorShowType {
 | 
 |  |  |   SILENT = 0,
 | 
 |  |  |   WARN_MESSAGE = 1,
 | 
 |  |  |   ERROR_MESSAGE = 2,
 | 
 |  |  |   NOTIFICATION = 3,
 | 
 |  |  |   REDIRECT = 9,
 | 
 |  |  | }
 | 
 |  |  | // 与后端约定的响应数据格式
 | 
 |  |  | interface ResponseStructure {
 | 
 |  |  |   success: boolean;
 | 
 |  |  |   data: any;
 | 
 |  |  |   errorCode?: number;
 | 
 |  |  |   errorMessage?: string;
 | 
 |  |  |   showType?: ErrorShowType;
 | 
 |  |  | }
 | 
 |  |  | 
 | 
 |  |  | /**
 | 
 |  |  |  * @name 错误处理
 | 
 |  |  |  * pro 自带的错误处理, 可以在这里做自己的改动
 | 
 |  |  |  * @doc https://umijs.org/docs/max/request#配置
 | 
 |  |  |  */
 | 
 |  |  | export const errorConfig: RequestConfig = {
 | 
 |  |  |   // 错误处理: umi@3 的错误处理方案。
 | 
 |  |  |   errorConfig: {
 | 
 |  |  |     // 错误抛出
 | 
 |  |  |     errorThrower: (res) => {
 | 
 |  |  |       const { success, data, errorCode, errorMessage, showType } =
 | 
 |  |  |         res as unknown as ResponseStructure;
 | 
 |  |  |       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 (opts?.skipErrorHandler) throw error;
 | 
 |  |  |       // 我们的 errorThrower 抛出的错误。
 | 
 |  |  |       if (error.name === 'BizError') {
 | 
 |  |  |         const errorInfo: ResponseStructure | undefined = error.info;
 | 
 |  |  |         if (errorInfo) {
 | 
 |  |  |           const { errorMessage, errorCode } = errorInfo;
 | 
 |  |  |           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.open({
 | 
 |  |  |                 description: errorMessage,
 | 
 |  |  |                 message: errorCode,
 | 
 |  |  |               });
 | 
 |  |  |               break;
 | 
 |  |  |             case ErrorShowType.REDIRECT:
 | 
 |  |  |               // TODO: redirect
 | 
 |  |  |               break;
 | 
 |  |  |             default:
 | 
 |  |  |               message.error(errorMessage);
 | 
 |  |  |           }
 | 
 |  |  |         }
 | 
 |  |  |       } else if (error.response) {
 | 
 |  |  |         // Axios 的错误
 | 
 |  |  |         // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
 | 
 |  |  |         message.error(`Response status:${error.response.status}`);
 | 
 |  |  |       } else if (error.request) {
 | 
 |  |  |         // 请求已经成功发起,但没有收到响应
 | 
 |  |  |         // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
 | 
 |  |  |         // 而在node.js中是 http.ClientRequest 的实例
 | 
 |  |  |         message.error('None response! Please retry.');
 | 
 |  |  |       } else {
 | 
 |  |  |         // 发送请求时出了点问题
 | 
 |  |  |         message.error('Request error, please retry.');
 | 
 |  |  |       }
 | 
 |  |  |     },
 | 
 |  |  |   },
 | 
 |  |  | 
 | 
 |  |  |   // 请求拦截器
 | 
 |  |  |   requestInterceptors: [
 | 
 |  |  |     (config: RequestOptions) => {
 | 
 |  |  |       // 拦截请求配置,进行个性化处理。
 | 
 |  |  |       const url = config?.url?.concat('?token = 123');
 | 
 |  |  |       return { ...config, url };
 | 
 |  |  |     },
 | 
 |  |  |   ],
 | 
 |  |  | 
 | 
 |  |  |   // 响应拦截器
 | 
 |  |  |   responseInterceptors: [
 | 
 |  |  |     (response) => {
 | 
 |  |  |       // 拦截响应数据,进行个性化处理
 | 
 |  |  |       const { data } = response as unknown as ResponseStructure;
 | 
 |  |  | 
 | 
 |  |  |       if (data?.success === false) {
 | 
 |  |  |         message.error('请求失败!');
 | 
 |  |  |       }
 | 
 |  |  |       return response;
 | 
 |  |  |     },
 | 
 |  |  |   ],
 | 
 |  |  | };
 |