You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.4 KiB

8 months ago
import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { message, notification } from 'antd';
// 错误处理方案: 错误类型
enum ErrorShowType {
SILENT = 0,
}
// 与后端约定的响应数据格式
interface ResponseStructure {
data: any;
code?: number;
message?: string;
}
/**
* @name
* pro
* @doc https://umijs.org/docs/max/request#配置
*/
export const errorConfig: RequestConfig = {
// 错误处理: umi@3 的错误处理方案。
errorConfig: {
// 错误抛出
errorThrower: (res) => {
const { data, code, message } =
res as unknown as ResponseStructure;
if (code !== 0) {
const error: any = new Error(message);
error.name = 'BizError';
error.info = { code, message, 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 { message, code } = errorInfo;
// switch (errorInfo.showType) {
// case ErrorShowType.SILENT:
// // do nothing
// break;
// case ErrorShowType.WARN_MESSAGE:
// message.warning(message);
// break;
// case ErrorShowType.ERROR_MESSAGE:
// message.error(message);
// break;
// case ErrorShowType.NOTIFICATION:
// notification.open({
// description: message,
// message: code,
// });
// break;
// case ErrorShowType.REDIRECT:
// // TODO: redirect
// break;
// default:
message.error(errorInfo.message);
// }
}
} 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;
const { code, message } = data;
if (code !== 0) {
const error: any = new Error(message);
error.name = 'BizError';
error.info = data;
throw error; // 抛出自制的错误
} else {
return response;
}
},
],
};