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

相关推荐
weixin_39938069几秒前
TongWeb8.0.9.0.3部署后端应用,前端访问后端报405(by sy+lqw)
前端
伍哥的传说21 分钟前
H3初识——入门介绍之常用中间件
前端·javascript·react.js·中间件·前端框架·node.js·ecmascript
洛小豆1 小时前
深入理解Pinia:Options API vs Composition API两种Store定义方式完全指南
前端·javascript·vue.js
洛小豆1 小时前
JavaScript 对象属性访问的那些坑:她问我为什么用 result.id 而不是 result['id']?我说我不知道...
前端·javascript·vue.js
witton1 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
叹一曲当时只道是寻常1 小时前
Softhub软件下载站实战开发(十六):仪表盘前端设计与实现
前端·golang
超级土豆粉1 小时前
npm 包 scheduler 介绍
前端·npm·node.js
bug爱好者1 小时前
原生小程序如何实现跨页面传值
前端·javascript
随笔记1 小时前
uniapp开发的小程序输入框在ios自动填充密码,如何欺骗苹果手机不让自动填充
前端·ios·app
bug爱好者1 小时前
原生微信小程序最实用的工具函数合集
前端·javascript