interceptor.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import axios from 'axios';
  2. import store from '../states/store';
  3. import { API_BASE_URL } from './config';
  4. import { SystemMode } from '../states/systemModeSlice';
  5. import emitter from '../utils/eventEmitter';
  6. const axiosInstance = axios.create({
  7. baseURL: API_BASE_URL,
  8. });
  9. axiosInstance.interceptors.request.use(
  10. (config) => {
  11. const state = store.getState();
  12. console.log(`当前系统模式:${state.systemMode.mode}`);
  13. const token =
  14. state.systemMode.mode === SystemMode.Emergency
  15. ? state.product.guest
  16. : state.userInfo.token;
  17. const { productName, language, source } = state.product;
  18. config.headers.Authorization = `Bearer ${token}`;
  19. config.headers.Language = language;
  20. config.headers.Product = productName;
  21. config.headers.Source = source;
  22. return config;
  23. },
  24. (error) => {
  25. return Promise.reject(error);
  26. }
  27. );
  28. // 请求拦截器
  29. axiosInstance.interceptors.request.use(
  30. (config) => {
  31. console.log('【网络】🚀 请求:', {
  32. url: config.url,
  33. method: config.method,
  34. headers: config.headers,
  35. data: config.data,
  36. params: config.params,
  37. });
  38. return config;
  39. },
  40. (error) => {
  41. console.error('【网络】❌ 请求错误:', error);
  42. return Promise.reject(error);
  43. }
  44. );
  45. // 响应拦截器
  46. axiosInstance.interceptors.response.use(
  47. (response) => {
  48. if (response.data.code !== '0x000000') {
  49. console.error('【网络】❌ 响应错误,非"0x000000":', {
  50. url: response.config.url,
  51. status: response.status,
  52. data: response.data,
  53. });
  54. } else {
  55. console.log('【网络】✅ 响应:', {
  56. url: response.config.url,
  57. status: response.status,
  58. data: response.data,
  59. });
  60. }
  61. return response;
  62. },
  63. (error) => {
  64. console.error('【网络】❌ 响应错误:', {
  65. url: error.config?.url,
  66. status: error.response?.status,
  67. message: error.message,
  68. data: error.response?.data,
  69. });
  70. return Promise.reject(error);
  71. }
  72. );
  73. axiosInstance.interceptors.response.use(
  74. (response) => {
  75. return response;
  76. },
  77. (error) => {
  78. if (error.response && error.response.data.code === 0x000101) {
  79. emitter.emit('tokenExpired');
  80. // eslint-disable-next-line
  81. return new Promise(() => {}); // Suspend the current execution
  82. }
  83. return Promise.reject(error);
  84. }
  85. );
  86. export default axiosInstance;