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