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 封装更加模块化、可维护、可扩展!🚀

相关推荐
仰望星空的小猴子2 分钟前
React18和React19新特性
前端
小码哥_常3 分钟前
Android新航标:Navigation 3为何成为变革先锋?
前端
SuperEugene4 分钟前
Vue状态管理扫盲篇:状态管理中的常见坑 | 循环依赖、状态污染与调试技巧
前端·vue.js·面试
骑着小黑马5 分钟前
从 Electron 到 Tauri 2:我用 3.5MB 做了个音乐播放器
前端·vue.js·typescript
aykon5 分钟前
DataSource详解以及优势
前端
Mintopia6 分钟前
戴了 30 天智能手环后,我才发现自己一直低估了“睡眠”
前端
leolee186 分钟前
react redux 简单使用
前端·react.js·redux
仰望星空的小猴子7 分钟前
常用的Hooks
前端
天才熊猫君7 分钟前
Vue Fragment 锚点机制
前端
米丘8 分钟前
Git 常用操作命令
前端