imeeting/frontend/src/api/http.ts

52 lines
1.4 KiB
TypeScript

import axios from "axios";
const http = axios.create({
baseURL: "",
timeout: 15000
});
http.interceptors.request.use((config) => {
const token = localStorage.getItem("accessToken");
if (token) {
config.headers = config.headers || {};
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
http.interceptors.response.use(
(resp) => {
const body = resp.data;
if (body && body.code !== "0") {
const err = new Error(body.msg || "请求失败");
(err as any).code = body.code;
(err as any).msg = body.msg;
return Promise.reject(err);
}
return resp;
},
(error) => {
if (error.response && (error.response.status === 401 || error.response.status === 403)) {
// Clear session/local storage
localStorage.removeItem("accessToken");
localStorage.removeItem("refreshToken");
sessionStorage.removeItem("userProfile");
// Force redirect to login with timeout flag
window.location.href = "/login?timeout=1";
}
// Process backend error message if available in response body even for non-200 status
const body = error.response?.data;
if (body && body.msg) {
const err = new Error(body.msg);
(err as any).code = body.code;
(err as any).msg = body.msg;
return Promise.reject(err);
}
return Promise.reject(error);
}
);
export default http;