跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

Axios 错误处理进阶封装:实现网络层数据与状态解耦

网络请求失败是前端常态,成熟的工程化项目需将错误处理下沉至 Axios 层。通过拦截器统一处理 HTTP 状态码与业务异常,结合策略映射实现分级响应,并标准化错误对象结构。此举能有效避免业务代码污染,实现网络层数据与状态的解耦,显著提升代码整洁度与系统扩展性。

人间失格发布于 2026/4/8更新于 2026/10/2484 浏览
Axios 错误处理进阶封装:实现网络层数据与状态解耦

Axios 错误处理进阶封装:实现网络层数据与状态解耦

在前端项目中,网络请求失败不是异常,而是常态。真正拉开项目工程质量差距的,往往不是会不会用 axios,而是如何设计一套可维护、可扩展、可协作的网络错误处理体系。成熟的项目组有现成可用的 axios 网络封装设计,而不成熟的项目组网络错误处理原始而杂乱。很多开发者即便在成熟项目组工作多年,依然只停留在'知道有拦截器'却不知如何设计的阶段。

本文围绕 Axios 的拦截器机制,系统性分析可配置、可分级、可扩展的网络请求实战封装策略。

为什么网络错误处理一定要下沉到 Axios 层

如果在业务层直接处理常规错误,每个 async/await 都要包裹一段 try-catch。同一种错误(如 token 过期)会被重复处理 N 次,UI 提示风格也难以统一,后续想要改动逻辑极其痛苦。

// 典型的业务层污染示例
async function loadList() {
  try {
    const res = await getList();
    list.value = res.data;
  } catch (e) {
    ElMessage.error('请求失败');
  }
}

这显然是不可取的。对于网络错误的判断逻辑、分类、兜底策略,本就应该属于请求基础设施层。将错误分级并合并统一处理,才能让业务代码保持纯净。

Axios 拦截器 Interceptors

Axios 提供了两个关键拦截器:请求拦截器和响应拦截器,它们可以用来行使不同的职责。

1. 拦截器的基础应用

网络请求的失败通常分为两大类:其一是 HTTP/网络层错误,比如断网、请求超时、上游错误(500/502/503)等;其二是业务层错误,比如 code !== 0(响应状态码是 200,但业务状态异常)、token 过期、权限问题等。

我们需要创建一个 axios 实例,并在其中配置拦截器。

// src/utils/api.js
import axios from 'axios';
import { ElMessage } from 'element-plus';

// 创建 axios 实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || ,
  : ,
});


request...(
   {
    
     token = .();
     (token) {
      config.. = ;
    }
     config;
  },
   {
     .(error);
  }
);


request...(
   {
     { code, message, data } = response.;
     (code !== ) {
       .({ : , code, message });
    }
     data;
  },
   {
     { response } = error;
     (response) {
      
       (response.) {
         :
          .();
          ;
         :
          .();
          
          
          ;
         :
          .();
          ;
         :
          .();
          ;
         :
          .();
          ;
        :
          .();
      }
    }   (error.) {
      
      .();
    }  {
      
      .();
    }
     .(error);
  }
);

  request;
'/api'
timeout
10000
// 请求拦截器(可选:添加 token 等)
interceptors
request
use
(config) =>
// 例如:从 localStorage 获取 token 并添加到请求头
const
localStorage
getItem
'token'
if
headers
Authorization
`Bearer ${token}`
return
(error) =>
return
Promise
reject
// 响应拦截是集中处理错误的核心
interceptors
response
use
(response) =>
const
data
if
0
return
Promise
reject
type
'business'
return
(error) =>
const
if
// 有响应(HTTP 状态码 4xx / 5xx)
switch
status
case
400
ElMessage
error
'请求参数错误'
break
case
401
ElMessage
error
'未授权,请重新登录'
// 可跳转到登录页
// window.location.href = '/login';
break
case
403
ElMessage
error
'拒绝访问'
break
case
404
ElMessage
error
'请求资源不存在'
break
case
500
ElMessage
error
'服务器内部错误'
break
default
ElMessage
error
`请求失败:${response.status}`
else
if
request
// 请求已发出但无响应(如网络错误、超时)
ElMessage
error
'网络异常,请检查网络连接'
else
// 其他错误(如配置错误)
ElMessage
error
'请求配置错误'
return
Promise
reject
export
default

此时业务层已经做到了数据与状态的解耦。状态问题和错误信息全部在拦截器阶段处理,返回给业务调用接口位置的只有数据:

// 在响应拦截器里面,返回的是 response.data.data,所以业务层里面只会拿到数据
const data = await api.getUser();

这样业务层就不用关心 HTTP 状态码和后端返回的具体结构,也不用对请求错误类型进行具体的区分了。

2. 错误分级和策略映射的设计

错误的严重程度是有等级的,不应该把所有的错误都按相同的方式处理。比如 401,一般情况下应该去实现用户无感刷新,或者在多次失败后提示用户重新登录。

只需要加上一个简单的策略映射设计:

const errorHandlers = {
  401() {
    logout();
    router.push('/login');
  },
  403() {
    ElMessage.error('没有权限');
  },
  default(err) {
    ElMessage.error(err.message || '请求失败');
  }
};

并在拦截器中统一调度:

function handleBusinessError(err) {
  const handler = errorHandlers[err.code] || errorHandlers.default;
  handler(err);
}

这样就能根据状态码的不同,映射不同的处理方法,长期维护和拓展问题也解决了。

3. 错误对象标准化

很多项目后期痛苦的根源是 error 有时候是 string,有时候是 AxiosError,有时候是后端对象。所以需要永久地将错误处理的复杂度从业务层转移到基础设施层(即 Axios),以此来实现一个架构层面的收益。

比如定义一个标准错误结构(这部分代码仅 TS 需要):

interface AppError {
  type: 'network' | 'business';
  code?: number;
  message: string;
  raw?: any;
}

然后在 Axios 层构造,举个例子:

axios.interceptors.response.use(
  res => {
    if (res.data.code !== 0) {
      return Promise.reject({
        type: 'business',
        code: res.data.code,
        message: res.data.msg,
        raw: res
      });
    }
    return res.data.data;
  },
  error => {
    return Promise.reject({
      type: 'network',
      message: '网络异常,请稍后重试',
      raw: error
    });
  }
);

那么在业务层就只需要面对一种 error 类型了,不用操心错误类型,业务代码降维:

try {
  await api.save();
  ElMessage.success('保存成功');
} catch (err) {
  ElMessage.error(err.message);
}

结语

一个成熟的 Axios 错误处理体系,应该能做到错误集中处理,业务代码干净,错误分级,有明确策略,错误结构统一,方便扩展,自然接入登录、权限、数据监控等模块。**错误处理不是异常流程,而是系统设计的一部分。**做好网络层的错误处理,实现数据与状态的解耦,会让业务层开发大有裨益。

目录

  1. Axios 错误处理进阶封装:实现网络层数据与状态解耦
  2. 为什么网络错误处理一定要下沉到 Axios 层
  3. Axios 拦截器 Interceptors
  4. 1. 拦截器的基础应用
  5. 2. 错误分级和策略映射的设计
  6. 3. 错误对象标准化
  7. 结语

更多推荐文章

查看全部
  • C++ STL list 容器详解:使用与模拟实现
  • 线性动态规划经典四题实战解析
  • 利用 Ollama + RAGFlow 部署千问大模型构建个人知识库 AI 智能体
  • Flutter wasm_ffi 在鸿蒙端的适配与实战指南
  • Antigravity:谷歌推出的免费 AI 编程工具评测与使用指南
  • Windows 下配置 KDB+、JupyterQ 与 Python (embedPy) 环境
  • Python Pandas 高效读取 Excel 文件完整指南
  • Clawbot 接入飞书与阿里云部署指南:打造 24 小时 AI 助理
  • 动态规划专题:子序列问题深度解析
  • 视觉语言模型(VLM)综述:训练、评估与扩展指南
  • Python 学习指南:基础语法、项目实战与职业路径
  • Go 1.24 Map 底层重构解析与性能收益
  • 旧安卓手机部署 Typecho 博客并实现外网访问
  • Python 实现空间注意力神经网络(SANN)的设计与实战
  • C++ map 容器:键值对有序管理与高效检索
  • 基于 Stable Diffusion v1.5 的企业产品概念图批量生成实践
  • Python 使用 Turtle 库实现动态烟花模拟效果
  • 无人机“黑飞”正式入法:2026 年 1 月 1 日起违规飞行将面临拘留
  • 环形链表检测、数组交集与随机链表复制
  • OpenDroneMap 实战指南:从无人机影像生成地理数据

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online