request.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import axios, { Axios, AxiosRequestConfig } from 'axios';
  2. import { AXIOS_BASEURL } from '@/spec-config';
  3. import { useUserStore } from '@/store/user';
  4. import { getToken } from '@/utils/localStorage/user';
  5. export interface MyAxiosPromise<T = any>
  6. extends Promise<{
  7. code: number;
  8. data: T;
  9. message: string;
  10. }> {}
  11. interface MyAxiosInstance extends Axios {
  12. // eslint-disable-next-line
  13. (config: AxiosRequestConfig): MyAxiosPromise;
  14. // eslint-disable-next-line
  15. (url: string, config?: AxiosRequestConfig): MyAxiosPromise;
  16. }
  17. class MyAxios {
  18. // axios 实例
  19. instance: MyAxiosInstance;
  20. constructor(config: AxiosRequestConfig) {
  21. // @ts-ignore
  22. this.instance = axios.create(config);
  23. // 请求拦截器
  24. this.instance.interceptors.request.use(
  25. (cfg) => {
  26. const token = getToken();
  27. if (token) {
  28. // eslint-disable-next-line
  29. cfg.headers.Authorization = `Bearer ${token}`;
  30. }
  31. return cfg;
  32. },
  33. (error) => {
  34. console.log(error);
  35. return Promise.reject(error);
  36. }
  37. );
  38. // 响应拦截器
  39. this.instance.interceptors.response.use(
  40. (response) => {
  41. console.log('response.config.url', response.config.url);
  42. console.log('response.data', response.data);
  43. return response.data;
  44. },
  45. (error) => {
  46. console.log('响应拦截到错误', error);
  47. if (error.message.indexOf('timeout') !== -1) {
  48. console.error(error.message);
  49. window.$message.error('请求超时,请重试');
  50. return;
  51. }
  52. const statusCode = error.response.status as number;
  53. const errorResponse = error.response;
  54. const errorResponseData = errorResponse.data;
  55. const whiteList = ['400', '401', '403', '404', '500'];
  56. if (error.response) {
  57. if (!whiteList.includes(`${statusCode}`)) {
  58. window.$message.error(error.message);
  59. return Promise.reject(error.message);
  60. }
  61. if (statusCode === 400) {
  62. console.error(errorResponseData.message);
  63. window.$message.error(errorResponseData.message);
  64. return Promise.reject(errorResponseData);
  65. }
  66. if (statusCode === 401) {
  67. console.error(errorResponseData.message);
  68. window.$message.error(errorResponseData.message);
  69. const userStore = useUserStore();
  70. userStore.logout();
  71. return Promise.reject(errorResponseData);
  72. }
  73. if (statusCode === 403) {
  74. console.error(errorResponseData.message);
  75. window.$message.error(errorResponseData.message);
  76. return Promise.reject(errorResponseData);
  77. }
  78. if (statusCode === 404) {
  79. console.error(errorResponseData.message);
  80. window.$message.error(errorResponseData.message);
  81. return Promise.reject(errorResponseData);
  82. }
  83. if (statusCode === 500) {
  84. console.error(errorResponseData.error);
  85. window.$message.error(errorResponseData.error);
  86. return Promise.reject(errorResponseData);
  87. }
  88. } else {
  89. // 请求超时没有response
  90. console.error(error.message);
  91. window.$message.error(error.message);
  92. return Promise.reject(error.message);
  93. }
  94. }
  95. );
  96. }
  97. get<T = any>(
  98. url: string,
  99. config?: AxiosRequestConfig<any> | undefined
  100. ): MyAxiosPromise<T> {
  101. return this.instance.get(url, config);
  102. }
  103. post<T = any>(
  104. url: string,
  105. data?: {} | undefined,
  106. config?: AxiosRequestConfig
  107. ): MyAxiosPromise<T> {
  108. return this.instance.post(url, data, config);
  109. }
  110. put<T = any>(
  111. url: string,
  112. data?: {} | undefined,
  113. config?: AxiosRequestConfig
  114. ): MyAxiosPromise<T> {
  115. return this.instance.put(url, data, config);
  116. }
  117. }
  118. export default new MyAxios({
  119. baseURL: AXIOS_BASEURL,
  120. // baseURL: '/prodapi',
  121. timeout: 1000 * 5,
  122. });