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

相关推荐
whm277712 分钟前
Visual Basic 参数传送-形参与实参
开发语言·visual studio
蒙特卡洛的随机游走17 分钟前
Spark的宽依赖与窄依赖
大数据·前端·spark
共享家952724 分钟前
QT-常用控件(多元素控件)
开发语言·前端·qt
幸运小圣25 分钟前
Iterator迭代器 【ES6】
开发语言·javascript·es6
葱头的故事26 分钟前
将传给后端的数据转换为以formData的类型传递
开发语言·前端·javascript
_233338 分钟前
vue3二次封装element-plus表格,slot透传,动态slot。
前端·vue.js
jump68041 分钟前
js中数组详解
前端·面试
崽崽长肉肉44 分钟前
iOS 基于Vision.framework从图片中提取文字
前端
温宇飞1 小时前
Web Abort API - AbortSignal 与 AbortController
前端
Tomoon1 小时前
前端开发者的全栈逆袭
前端