| 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;  | 
|     },  | 
|   ],  | 
| };  |