requestErrorConfig.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import axios from 'axios';
  2. import { ErrorShowType } from '@/defines';
  3. import { reportError } from '@/firebase';
  4. import { message, notification } from '@/utils/antdAppInstance';
  5. import { RequestConfig } from '@/utils/request/types';
  6. // import { toLoginPage } from '@/utils/routerUtils';
  7. /**
  8. * @name 错误处理
  9. */
  10. export const errorConfig: RequestConfig = {
  11. // 错误处理: umi@3 的错误处理方案。
  12. errorConfig: {
  13. // 错误抛出
  14. errorThrower: (res: any) => {
  15. const { success, data, errorCode, errorMessage, showType } =
  16. res as unknown as API.Result;
  17. if (!success) {
  18. const error: any = new Error(errorMessage);
  19. error.name = 'BizError';
  20. error.info = { errorCode, errorMessage, showType, data };
  21. throw error; // 抛出自制的错误
  22. }
  23. },
  24. // 错误接收及处理
  25. errorHandler: (error: any, opts: any) => {
  26. if (axios.isCancel(error)) {
  27. console.warn('请求已被取消', error, opts);
  28. Object.assign(error, { isCanceled: true });
  29. return;
  30. }
  31. // 错误上报逻辑
  32. if (error.name === 'BizError') {
  33. // 接口业务错误
  34. const errorInfo: API.Result | undefined = error.info;
  35. if (errorInfo) {
  36. const { errorMessage, errorCode, data } = errorInfo;
  37. reportError(error, {
  38. errorName: 'apiBiz',
  39. errorCode: errorCode,
  40. errorMessage: errorMessage,
  41. errorData: data,
  42. requestUrl: opts?.url,
  43. requestMethod: opts?.method,
  44. });
  45. }
  46. } else if (error.response) {
  47. // 接口响应错误
  48. reportError(error, {
  49. errorName: 'apiResponse',
  50. errorCode: error.response.status,
  51. errorMessage: error.message,
  52. responseData: error.response.data,
  53. requestUrl: error.config?.url,
  54. requestMethod: error.config?.method,
  55. });
  56. } else if (error.request) {
  57. // 请求已经成功发起,但没有收到响应
  58. reportError(error, {
  59. errorName: 'apiNetwork',
  60. errorMessage: 'None response',
  61. requestUrl: error.config?.url,
  62. requestMethod: error.config?.method,
  63. });
  64. } else {
  65. // 发送请求时出了点问题
  66. reportError(error, {
  67. errorName: 'apiRequest',
  68. errorMessage: 'Invalid request configuration or parameters',
  69. requestUrl: error.config?.url,
  70. requestMethod: error.config?.method,
  71. });
  72. }
  73. if (opts?.skipErrorHandler) throw error;
  74. // errorThrower 抛出的错误。
  75. if (error.name === 'BizError') {
  76. const errorInfo: API.Result | undefined = error.info;
  77. if (errorInfo) {
  78. const { errorMessage, errorCode } = errorInfo;
  79. if (errorCode === 401) {
  80. // 如果接口返回 401 错误,跳转到登录页
  81. // toLoginPage(); // 本项目没有登录页,所以不跳转
  82. return;
  83. }
  84. switch (errorInfo.showType) {
  85. case ErrorShowType.SILENT:
  86. // do nothing
  87. break;
  88. case ErrorShowType.WARN_MESSAGE:
  89. message.warning(errorMessage);
  90. break;
  91. case ErrorShowType.ERROR_MESSAGE:
  92. message.error(errorMessage);
  93. break;
  94. case ErrorShowType.NOTIFICATION:
  95. notification.error({
  96. description: errorMessage,
  97. message: errorCode,
  98. });
  99. break;
  100. case ErrorShowType.REDIRECT:
  101. // TODO: redirect
  102. break;
  103. default:
  104. message.error(errorMessage);
  105. }
  106. }
  107. } else if (error.response) {
  108. // Axios 的错误
  109. if (error.response.status === 401) {
  110. // toLoginPage();
  111. return;
  112. }
  113. notification.error({
  114. message: error.response.status,
  115. description: error.message,
  116. });
  117. } else if (error.request) {
  118. // 请求已经成功发起,但没有收到响应
  119. message.error('None response! Please retry.');
  120. } else {
  121. // 发送请求时出了点问题
  122. message.error('Request error, please retry.');
  123. }
  124. },
  125. },
  126. };