Files
web-Iot/src/api/request.ts
2026-04-30 15:02:08 +08:00

81 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
import envConfig from '../../env';
import Cookies from 'js-cookie';
import { message } from 'antd';
const API_BASE_URL = envConfig.baseURL;
const api = axios.create({
baseURL: API_BASE_URL,
timeout: 50000,
headers: {
'Content-Type': 'application/json',
},
withCredentials: true,
});
// 请求拦截器
api.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
const token = localStorage.getItem('token');
if (token && config.headers) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
(error: AxiosError) => {
return Promise.reject(error);
}
);
// 响应拦截器(处理 401 + 网络错误 + 服务挂了)
api.interceptors.response.use(
(response) => {
return response.data;
},
async (error: AxiosError) => {
// ==============================================
// 👇 这里处理:服务挂了 / 断网 / 请求失败 / 500
// ==============================================
if (!error.response) {
message.error('服务异常或网络断开,即将重新登录');
localStorage.clear();
Cookies.remove('userId');
Cookies.remove('Admin-Token');
// 动态加载 store 避免循环引用
const store = await import('../store');
const { logout } = await import('../store/userSlice');
store.default.dispatch(logout());
setTimeout(() => {
window.location.href = '/login';
}, 800);
return Promise.reject(error);
}
// ==============================================
// 👇 这里处理:401 未授权 / token 过期
// ==============================================
if (error.response.status === 401) {
localStorage.clear();
Cookies.remove('userId');
Cookies.remove('Admin-Token');
const store = await import('../store');
const { logout } = await import('../store/userSlice');
store.default.dispatch(logout());
message.error('登录已过期,请重新登录');
setTimeout(() => {
window.location.href = '/login';
}, 800);
}
// 其他错误(500等)不跳转,只返回错误
return Promise.reject(error);
}
);
export default api;