新增错误消息防抖机制,优化错误提示显示并清理冗余代码

This commit is contained in:
WUSIJIAN
2026-01-05 10:05:25 +08:00
parent c5c1c32193
commit 3ee3c90462
14 changed files with 49 additions and 38 deletions

View File

@@ -6,6 +6,22 @@ import qs from 'qs';
// 标记是否正在处理 token 过期,避免重复弹窗
let isHandlingTokenExpired = false;
// 错误消息防抖:防止短时间内显示多个错误消息
let lastErrorTime = 0;
const ERROR_MESSAGE_INTERVAL = 2000; // 2秒内只显示一个错误
const showErrorMessage = (message: string) => {
const now = Date.now();
// 2秒内只显示一个错误消息不管内容是否相同
if (now - lastErrorTime < ERROR_MESSAGE_INTERVAL) {
return; // 跳过
}
lastErrorTime = now;
ElMessage.error(message);
};
// 配置新建第一个 axios 实例(原来的主服务)
const service: AxiosInstance = axios.create({
baseURL: import.meta.env.VITE_API_URL,
@@ -20,9 +36,6 @@ const service: AxiosInstance = axios.create({
// 配置新建第二个 axios 实例(新功能服务)
const newService: AxiosInstance = axios.create({
// baseURL: 'http://192.168.3.95:8000/',
// baseURL: 'http://192.168.3.49:8000/',
// baseURL: 'http://localhost:8000/',
baseURL: 'http://192.168.3.200:8000/',
// baseURL: 'http://192.168.3.11:8000/',
timeout: 50000,
@@ -118,7 +131,7 @@ const responseInterceptor = (response: AxiosResponse) => {
// 业务逻辑错误处理
if (code !== undefined && code !== 0 && code !== 200) {
const errorMsg = message || `请求失败(${code})`;
ElMessage.error(errorMsg);
showErrorMessage(errorMsg);
return Promise.reject(new Error(errorMsg));
}
@@ -130,7 +143,7 @@ const responseErrorHandler = (error: any) => {
console.error('API请求错误:', error);
if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
ElMessage.error('请求超时,请检查网络连接');
showErrorMessage('请求超时,请检查网络连接');
return Promise.reject(new Error('请求超时'));
}
@@ -144,7 +157,8 @@ const responseErrorHandler = (error: any) => {
}
const httpStatus = error.response.status;
const message = error.response.data?.message || error.response.statusText;
// 优先使用返回数据中的 message 字段
const responseMessage = error.response.data?.message;
// 处理 HTTP 错误状态
switch (httpStatus) {
@@ -152,23 +166,23 @@ const responseErrorHandler = (error: any) => {
handleTokenExpired();
break;
case 403:
ElMessage.error('没有权限访问该资源');
showErrorMessage(responseMessage || '没有权限访问该资源');
break;
case 404:
ElMessage.error('请求的资源不存在');
showErrorMessage(responseMessage || '请求的资源不存在');
break;
case 500:
ElMessage.error('服务器内部错误');
showErrorMessage(responseMessage || '服务器内部错误');
break;
case 502:
ElMessage.error('网关错误');
showErrorMessage(responseMessage || '网关错误');
break;
case 503:
ElMessage.error('服务不可用');
showErrorMessage(responseMessage || '服务不可用');
break;
default:
if (httpStatus >= 400) {
ElMessage.error(message || `请求失败(${httpStatus})`);
showErrorMessage(responseMessage || `请求失败(${httpStatus})`);
}
}
@@ -184,4 +198,4 @@ newService.interceptors.response.use(responseInterceptor, responseErrorHandler);
// 导出
export default service;
export { newService };
export { newService, showErrorMessage };