123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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,
- }
- // 与后端约定的响应数据格式
- export 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');
- // 是否需要设置 token
- const isAdminToken = (config.headers || {})['authorization'];
- if (localStorage.getItem('Admin-Token') && !isAdminToken && config?.headers) {
- config.headers['authorization'] = localStorage.getItem('Admin-Token') + ''; // 让每个请求携带自定义token 请根据实际
- }
- return { ...config };
- },
- ],
- // 响应拦截器
- responseInterceptors: [
- (response) => {
- // 拦截响应数据,进行个性化处理
- const { data } = response as unknown as ResponseStructure;
- console.log(data);
- if (data?.code === 500) {
- if (data?.msg === '未登录或登录超时!') {
- }
- }
- if (data?.success === false) {
- message.error('请求失败!');
- }
- return response;
- },
- ],
- };
|