app.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // 运行时配置
  2. // import { RequestConfig, history } from '@umijs/max';
  3. import { getToken } from '@/utils/utils';
  4. import { message } from 'antd';
  5. import { RequestConfig, history } from '@umijs/max';
  6. // 全局初始化数据配置,用于 Layout 用户信息和权限初始化
  7. // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
  8. export async function getInitialState(): Promise<{ name: string }> {
  9. return { name: '@umijs/max' };
  10. }
  11. // axios配置
  12. export const request: RequestConfig = {
  13. errorConfig: {
  14. errorThrower(res: any) {
  15. console.log('errorThrower', res);
  16. },
  17. errorHandler(error: any, opts: any) {
  18. if (opts?.skipErrorHandler) throw error;
  19. // errorThrower 抛出的错误。
  20. if (error.name === 'AjaxError') {
  21. // 校验是否token失效
  22. if (tokenExpiredHandle(error.info.code)) return;
  23. const errorInfo: any = error.info;
  24. if (errorInfo) {
  25. message.error(errorInfo.msg || errorInfo.data);
  26. return error.info;
  27. }
  28. } else if (error.response) {
  29. // http错误,校验token是否失效
  30. if (tokenExpiredHandle(error.response.status)) return;
  31. // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
  32. message.error(`网络连接错误,请稍后重试(${error.response.status})`);
  33. } else if (error.request) {
  34. // 请求已经成功发起,但没有收到响应
  35. // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
  36. // 而在node.js中是 http.ClientRequest 的实例
  37. message.error('网络连接错误,请稍后重试(服务器未返回数据)。');
  38. } else {
  39. // 发送请求时出了点问题
  40. message.error('网络连接错误,请稍后重试(请求发送失败)。');
  41. }
  42. },
  43. },
  44. requestInterceptors: [
  45. (config: any) => {
  46. if (!config.headers) config.headers = {};
  47. config.headers['JWT-TOKEN'] = getToken();
  48. return config;
  49. },
  50. ],
  51. responseInterceptors: [
  52. (res: any) => {
  53. const resData = res.data;
  54. const { code, msg, data } = resData;
  55. if (code !== 200) {
  56. let error: any = {};
  57. error.name = 'AjaxError';
  58. error.info = { code, msg, data };
  59. // throw error;
  60. return Promise.reject(error);
  61. }
  62. return res;
  63. },
  64. ],
  65. };
  66. let tokenFlag: boolean = false;
  67. // token失效校验
  68. const tokenExpiredHandle = (code: number) => {
  69. if ([401, 601, 602, 603].includes(code)) {
  70. if (tokenFlag) return true;
  71. tokenFlag = true;
  72. setTimeout(() => {
  73. tokenFlag = false;
  74. }, 50000);
  75. message.error('token失效,请重新登录');
  76. history.push('/login');
  77. return true;
  78. } else {
  79. return false;
  80. }
  81. };