interceptor.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import axios from 'axios';
  2. import type {
  3. InternalAxiosRequestConfig,
  4. AxiosResponse,
  5. AxiosRequestHeaders,
  6. } from 'axios';
  7. import { Message, Modal } from '@arco-design/web-vue';
  8. import { useUserStore } from '@/store';
  9. import { getToken } from '@/utils/auth';
  10. const instance = axios.create({
  11. baseURL: import.meta.env.VITE_API_BASE_URL,
  12. });
  13. instance.interceptors.request.use(
  14. (config: InternalAxiosRequestConfig) => {
  15. // let each request carry token
  16. // this example using the JWT token
  17. // Authorization is a custom headers key
  18. // please modify it according to the actual situation
  19. const token = getToken();
  20. if (token) {
  21. if (!config.headers) {
  22. config.headers = {} as AxiosRequestHeaders;
  23. }
  24. config.headers.Authorization = `Bearer ${token}`;
  25. }
  26. return config;
  27. },
  28. error => {
  29. // do something
  30. return Promise.reject(error);
  31. }
  32. );
  33. // 响应拦截器修复版本
  34. instance.interceptors.response.use(
  35. (response: AxiosResponse) => {
  36. const res = response.data;
  37. console.log('res', res);
  38. if (response.status === 401) {
  39. Modal.error({
  40. title: 'Confirm logout',
  41. content:
  42. 'You have been logged out, you can cancel to stay on this page, or log in again',
  43. okText: 'Re-Login',
  44. async onOk() {
  45. const userStore = useUserStore();
  46. await userStore.logout();
  47. window.location.reload();
  48. },
  49. });
  50. }
  51. return response;
  52. },
  53. error => {
  54. Message.error({
  55. content: error.message || 'Request Error',
  56. duration: 5 * 1000,
  57. });
  58. return Promise.reject(error);
  59. }
  60. );
  61. export default instance;