ZBLOG

service.interceptors.response.use( response => { // 对响应数据做统一处理 const res = response.data // 自定义业务状态码处理 if (res.code !== 200) { ElMessage.error(res.message || 'Error') // 特殊状态码处理 if (res.code === 401)...

这段前端拦截器代码整体逻辑是正确的,但有几个细节可以优化。关于”网络连接异常”的提示问题,当前实现是合理的,以下是分析和建议:

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);
});

关键改进点:

  1. 更精细的错误分类:区分了error.response(服务响应错误)、error.request(无响应)、其他错误三种情况。
  2. 防抖处理:通过_silent标记可禁止某些接口的自动报错。
  3. 状态清理:401时彻底清理Vuex/Pinia中的登录状态。
  4. 友好提示:对典型场景给出更明确的指引。

如果仍有”网络连接异常”误报的情况,建议结合Chrome开发者工具的Network面板具体分析请求失败原因。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8115

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?