http.ts 814 B

123456789101112131415161718192021222324252627282930
  1. import axios from 'axios'
  2. import { getToken, setToken } from './token'
  3. /** 开发由 Vite 代理,生产由 Nginx 在 /viewer 下转发。 */
  4. export const http = axios.create({
  5. baseURL: import.meta.env.VITE_API_BASE ?? (import.meta.env.DEV ? '' : '/viewer'),
  6. timeout: 60000,
  7. })
  8. http.interceptors.request.use((config) => {
  9. const token = getToken()
  10. if (token) {
  11. config.headers = config.headers ?? {}
  12. config.headers.Authorization = `Bearer ${token}`
  13. }
  14. return config
  15. })
  16. http.interceptors.response.use(
  17. (response) => response,
  18. (error) => {
  19. const url = String(error?.config?.url ?? '')
  20. if (error?.response?.status === 401 && !url.includes('/api/login')) {
  21. setToken(null)
  22. window.dispatchEvent(new CustomEvent('auth-expired'))
  23. }
  24. return Promise.reject(error)
  25. },
  26. )