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