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