requestErrorConfig.ts 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { ErrorShowType } from '@/defines';
  2. import { message, notification } from '@/utils/antdAppInstance';
  3. import { toLoginPage } from '@/utils/routerUtils';
  4. import type { RequestConfig } from '@umijs/max';
  5. import axios from 'axios';
  6. /**
  7. * @name 错误处理
  8. * pro 自带的错误处理, 可以在这里做自己的改动
  9. * @doc https://umijs.org/docs/max/request#配置
  10. */
  11. export const errorConfig: RequestConfig = {
  12. // 错误处理: umi@3 的错误处理方案。
  13. errorConfig: {
  14. // 错误抛出
  15. errorThrower: (res) => {
  16. const { success, data, errorCode, errorMessage, showType } = 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. console.error('errorThrower error:', error);
  22. throw error; // 抛出自制的错误
  23. }
  24. },
  25. // 错误接收及处理
  26. errorHandler: (error: any, opts: any) => {
  27. if (opts?.skipErrorHandler) throw error;
  28. if (axios.isCancel(error)) {
  29. console.warn('请求已被取消', error, opts);
  30. error.isCanceled = true;
  31. return;
  32. }
  33. // errorThrower 抛出的错误。
  34. if (error.name === 'BizError') {
  35. const errorInfo: API.Result | undefined = error.info;
  36. if (errorInfo) {
  37. const { errorMessage, errorCode } = errorInfo;
  38. if (errorCode === 401) {
  39. toLoginPage();
  40. return;
  41. }
  42. switch (errorInfo.showType) {
  43. case ErrorShowType.SILENT:
  44. // do nothing
  45. break;
  46. case ErrorShowType.WARN_MESSAGE:
  47. message.warning(errorMessage);
  48. break;
  49. case ErrorShowType.ERROR_MESSAGE:
  50. message.error(errorMessage);
  51. break;
  52. case ErrorShowType.NOTIFICATION:
  53. notification.error({
  54. description: errorMessage,
  55. message: errorCode,
  56. });
  57. break;
  58. case ErrorShowType.REDIRECT:
  59. // TODO: redirect
  60. break;
  61. default:
  62. message.error(errorMessage);
  63. }
  64. }
  65. } else if (error.response) {
  66. // Axios 的错误
  67. // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
  68. //message.error(`Response status:${error.response.status}`);
  69. if (error.response.status === 401) {
  70. toLoginPage();
  71. return;
  72. }
  73. notification.error({
  74. message: error.response.status,
  75. description: error.message,
  76. });
  77. } else if (error.request) {
  78. // 请求已经成功发起,但没有收到响应
  79. // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
  80. // 而在node.js中是 http.ClientRequest 的实例
  81. message.error('None response! Please retry.');
  82. } else {
  83. // 发送请求时出了点问题
  84. message.error('Request error, please retry.');
  85. }
  86. },
  87. },
  88. };