Axios的二次封装

完整的 axios.js 封装

这个 axios.js 文件封装了:

  • 请求拦截器 (添加 token 到请求头)
  • 响应拦截器(统一错误处理)
  • 支持取消请求 (AbortController)
  • 动态 baseURL(根据环境自动切换)
  • 超时时间(防止请求卡死)

📌 axios.js 封装

javascript 复制代码
import axios from 'axios';

// 1️⃣ 动态 baseURL 配置
const BASE_URL = process.env.NODE_ENV === 'production' 
  ? 'https://api.prod.com'  // 生产环境
  : 'http://localhost:3000'; // 开发环境

// 2️⃣ 创建 Axios 实例
const createService = () => {
  const controller = new AbortController(); // 取消请求控制器
  const service = axios.create({
    baseURL: BASE_URL,  // 设置 baseURL
    timeout: 10000,     // 超时时间(10s)
    signal: controller.signal, // 绑定取消请求信号
    headers: {
      'Content-Type': 'application/json' // 默认 JSON 格式
    }
  });

  // 3️⃣ 请求拦截器
  service.interceptors.request.use(
    config => {
      const token = localStorage.getItem('token'); // 获取 Token
      if (token) {
        config.headers.Authorization = `Bearer ${token}`; // 统一携带 Token
      }
      return config;
    },
    error => {
      return Promise.reject(error);
    }
  );

  // 4️⃣ 响应拦截器
  service.interceptors.response.use(
    response => {
      return response.data; // 直接返回数据,省去 `data`
    },
    error => {
      if (error.response) {
        const status = error.response.status;
        switch (status) {
          case 401:
            console.error('未授权,请重新登录');
            localStorage.removeItem('token'); // 清除 token
            break;
          case 403:
            console.error('禁止访问');
            break;
          case 404:
            console.error('请求地址不存在');
            break;
          case 500:
            console.error('服务器错误');
            break;
          default:
            console.error('请求失败');
        }
      } else {
        console.error('网络异常');
      }
      return Promise.reject(error);
    }
  );

  return { service, controller };
};

// 导出封装好的 axios 实例
export default createService;

📌 如何在项目中使用

✅ 方式 1:发送 GET 请求

javascript 复制代码
import createService from './axios';

const { service } = createService();

service.get('/users')
  .then(data => console.log(data))
  .catch(error => console.error(error));

✅ 方式 2:发送 POST 请求

javascript 复制代码
import createService from './axios';

const { service } = createService();

service.post('/users', { name: 'Alice', age: 25 })
  .then(data => console.log(data))
  .catch(error => console.error(error));

✅ 方式 3:取消请求

javascript 复制代码
import createService from './axios';

// 组件加载时发起请求
const { service, controller } = createService();

service.get('/users')
  .then(data => console.log(data))
  .catch(error => console.error(error));

// 取消请求(比如在用户离开页面时)
setTimeout(() => {
  controller.abort();
  console.log('请求已取消');
}, 2000);

📌 总结

功能 代码封装
动态 baseURL process.env.NODE_ENV 自动切换
请求超时 timeout: 10000
请求拦截器 统一携带 token
响应拦截器 统一错误处理
支持取消请求 AbortController 取消请求

这样,我们的 axios 封装更加模块化、可维护、可扩展!🚀

相关推荐
布吉岛的石头几秒前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!25 分钟前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc1 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
昂好的day2 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
智能直播3 小时前
RK3518:1.5G 内存 + 8G 存储,如何跑起硬件编解码、Web、AI 识别、绿幕特效
前端·人工智能·5g
努力实干3 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
掘金酱4 小时前
【10.24 特别活动】AI 时代,程序员的新饭碗在哪里?
前端·人工智能·后端
excel4 小时前
多进程环境下使用 PM2 部署 Socket.IO:需要注意什么
前端
NetX行者4 小时前
四语言 Hello World 背后:编译模型与运行时对比
开发语言
IT_陈寒5 小时前
Redis的原子性竟然失效了?记一次分布式锁翻车实录
前端·人工智能·后端