request.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { RequestConfig } from './request';
  2. // 错误处理方案: 错误类型
  3. enum ErrorShowType {
  4. SILENT = 0,
  5. WARN_MESSAGE = 1,
  6. ERROR_MESSAGE = 2,
  7. NOTIFICATION = 3,
  8. REDIRECT = 9,
  9. }
  10. // 与后端约定的响应数据格式
  11. interface ResponseStructure {
  12. success: boolean;
  13. data: any;
  14. errorCode?: number;
  15. errorMessage?: string;
  16. showType?: ErrorShowType;
  17. }
  18. // 运行时配置
  19. export const request: RequestConfig = {
  20. // 统一的请求设定
  21. timeout: 1000,
  22. headers: {'X-Requested-With': 'XMLHttpRequest'},
  23. // 错误处理: umi@3 的错误处理方案。
  24. errorConfig: {
  25. // 错误抛出
  26. errorThrower: (res: ResponseStructure) => {
  27. const { success, data, errorCode, errorMessage, showType } = res;
  28. if (!success) {
  29. const error: any = new Error(errorMessage);
  30. error.name = 'BizError';
  31. error.info = { errorCode, errorMessage, showType, data };
  32. throw error; // 抛出自制的错误
  33. }
  34. },
  35. // 错误接收及处理
  36. errorHandler: (error: any, opts: any) => {
  37. if (opts?.skipErrorHandler) throw error;
  38. // 我们的 errorThrower 抛出的错误。
  39. if (error.name === 'BizError') {
  40. const errorInfo: ResponseStructure | undefined = error.info;
  41. if (errorInfo) {
  42. const { errorMessage, errorCode } = errorInfo;
  43. switch (errorInfo.showType) {
  44. case ErrorShowType.SILENT:
  45. // do nothing
  46. break;
  47. case ErrorShowType.WARN_MESSAGE:
  48. message.warn(errorMessage);
  49. break;
  50. case ErrorShowType.ERROR_MESSAGE:
  51. message.error(errorMessage);
  52. break;
  53. case ErrorShowType.NOTIFICATION:
  54. notification.open({
  55. description: errorMessage,
  56. message: errorCode,
  57. });
  58. break;
  59. case ErrorShowType.REDIRECT:
  60. // TODO: redirect
  61. break;
  62. default:
  63. message.error(errorMessage);
  64. }
  65. }
  66. } else if (error.response) {
  67. // Axios 的错误
  68. // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
  69. message.error(`Response status:${error.response.status}`);
  70. } else if (error.request) {
  71. // 请求已经成功发起,但没有收到响应
  72. // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
  73. // 而在node.js中是 http.ClientRequest 的实例
  74. message.error('None response! Please retry.');
  75. } else {
  76. // 发送请求时出了点问题
  77. message.error('Request error, please retry.');
  78. }
  79. },
  80. },
  81. // 请求拦截器
  82. requestInterceptors: [
  83. (config) => {
  84. // 拦截请求配置,进行个性化处理。
  85. const url = config.url.concat('?token = 123');
  86. return { ...config, url};
  87. }
  88. ],
  89. // 响应拦截器
  90. responseInterceptors: [
  91. (response) => {
  92. // 拦截响应数据,进行个性化处理
  93. const { data } = response;
  94. if(!data.success){
  95. message.error('请求失败!');
  96. }
  97. return response;
  98. }
  99. ]
  100. };