这段前端拦截器代码整体逻辑是正确的,但有几个细节可以优化。关于”网络连接异常”的提示问题,当前实现是合理的,以下是分析和建议:
1. 当前代码分析
service.interceptors.response.use(
response => {
// 正常响应处理
if (res.code !== 200) {
// ...业务错误处理
}
return res
},
error => {
// 异常响应处理
if (error.response) {
// HTTP状态码处理
} else if (error.message.includes('timeout')) {
error.message = '请求超时'
} else {
error.message = '网络连接异常' // 这里会捕获真正的网络问题
}
}
)
2. 可能触发”网络连接异常”的场景
- 浏览器离线状态(无网络)
- CORS跨域失败
- DNS解析失败
- 服务器完全无响应(非500错误)
- HTTPS证书错误
3. 优化建议
(1) 增强错误判断(推荐):
} else {
if (navigator.onLine === false) {
error.message = '您已离线,请检查网络连接'
} else if (error.code === 'ECONNABORTED') {
error.message = '请求超时'
} else if (error.message === 'Network Error') {
error.message = '网络连接异常(服务不可达)'
} else {
error.message = `未知错误: ${error.message}`
}
}
(2) 添加日志记录:
console.error('API Error:', error.config.url, error)
// Sentry/Raygun等错误监控上报
(3) 特殊处理401:
当前代码会在两个地方跳转登录页,可以统一处理:
// 移除response拦截器中的401跳转逻辑
// 只在error拦截器中处理:
case 401:
store.dispatch('user/logout') // Vuex/Pinia清理状态
router.push(`/login?redirect=${encodeURIComponent(router.currentRoute.fullPath)}`)
4. 完整优化版本
service.interceptors.response.use(
response => {
const res = response.data
if (res.code && res.code !== 200) { // &&防止undefined判断失误
ElMessage.closeAll() //避免重复提示
const msg = res.message || `[${res.code}]操作失败`
if ([400101,500001].includes(res.code)) { //特定业务码特殊处理
ElMessage.warning(msg)
} else {
ElMessage.error(msg)
}
return Promise.reject(new Error(msg))
}
return res ?? {} //防止undefined导致后续链式调用报错
}, async error => {
let message = ''
const originalConfig = error.config
if (error.response) {
switch(error.response.status){
case400: message='参数验证失败';break;
case401:
await store.dispatch('user/resetToken')
message='会话过期,请重新登录';
break;
case403: message='没有权限';break;
case404: message=`接口不存在: ${originalConfig.url}`;break;
case502: message='服务正在部署';break;
default: message=`服务器异常(${error.response.status})`;
}
if(error.response.data?.message){
message += `: ${error.response.data.message}`
}
}elseif(error.request){
if(error.code==='ECONNABORTED'){
message=`请求超时(${originalConfig.timeout}ms)`
}else{
message=navigator.onLine?'服务连接失败':'网络已断开'
}
}
!originalConfig._silent&&ElMessage.error(message);
returnPromise.reject(error);
});
关键改进点:
- 更精细的错误分类:区分了
error.response
(服务响应错误)、error.request
(无响应)、其他错误三种情况。 - 防抖处理:通过
_silent
标记可禁止某些接口的自动报错。 - 状态清理:401时彻底清理Vuex/Pinia中的登录状态。
- 友好提示:对典型场景给出更明确的指引。
如果仍有”网络连接异常”误报的情况,建议结合Chrome开发者工具的Network面板具体分析请求失败原因。
内容由零声教学AI助手提供,问题来源于学员提问