二次封装axios解决异步通信痛点

为了方便扩展,和增加配置的灵活性,这里将通过封装一个类来实现axios的二次封装,要实现的功能包括:

  1. 为请求传入自定义的配置,控制单次请求的不同行为
  2. 在响应拦截器中对业务逻辑进行处理,根据业务约定的成功数据结构,返回业务数据
  3. 对响应错误进行处理,配置显示对话框或消息形式的错误提示
  4. 显示全局的loading
  5. 给get请求加入时间戳,避免缓存
  6. 取消重复的请求
  7. 给请求携带token
  8. token过期时,根据配置决定退出登录或挂起未完成的请求,先去请求更新token的接口,成功后执行挂起的请求
  9. 遇到浏览器返回特定code码,重新发起请求
  10. 路由切换时可以取消未完成的请求
pnpm add axios qs lodash-es

目录

  • 整体结构
  • 创建axios实例
  • 存放多个系统api获取token、更换token的方法
  • 扩展axios类型
  • 自定义的默认请求配置
  • 工具函数
  • 二次封装axios
  • 请求拦截器的处理
  • 响应处理
    • 响应正确的处理
    • 响应错误的处理

整体结构

service/

├── apis 存放api接口,方便统一管理
├── axios
│ ├── axios.d.ts 扩展axios类型
│ ├── config.ts 自定义的配置
│ ├── index.ts 二次封装axios
│ ├── requestInterceptors.ts 处理请求拦截
│ ├── responseInterceptors.ts 处理响应拦截
│ └── utils.ts 工具函数
├── index.ts 创建axios实例
├── tokenManager.ts 存放多个系统api获取token、更换token的方法

创建axios实例

index.ts

import HttpService from './axios'
const service = new HttpService({baseURL: '/api', // 可根据环境变量配置timeout: 3000,headers: { 'Content-Type': 'application/json' }
})
export default service

存放多个系统api获取token、更换token的方法

tokenManager.ts

import { useUserStore } from '@/stores/user'
interface System {tokenKey: string // token 存储的 keyloginStatus: number // 指定后端返回的code,refreshToken为true时会更新tokenrefresh: boolean // token是否自动续期getToken: () => string | nullrefreshToken?: (config: any) => Promise<unknown>logout: () => void
}
// 存储刷新 token 的请求状态
let isRefreshing = false
// 存储挂起的请求列表
let requests: ((token: string) => void)[] = []export const SYSTEMS: { [key: string]: System } = {admin: {tokenKey: 'token',loginStatus: 401,refresh: true,getToken: () => {const userStore = useUserStore()return userStore.getToken},refreshToken: async (config: any) => {try {if (!isRefreshing) {isRefreshing = true // 标记正在刷新 tokenconst userStore = useUserStore()const newToken: string = await userStore.refreshToken() // 刷新tokenif (newToken) {requests.forEach((callback) => callback(newToken)) // 执行挂起的请求requests = []config.headers[SYSTEMS.admin.tokenKey] = newToken // 附加 token 到请求头isRefreshing = false // 标记刷新 token 结束return newToken} else {userStore.logout() // 退出登录throw new Error('Token 刷新失败')}}// 将本次请求加入挂起队列,并返回一个 Promise,在 refresh token 成功后执行return new Promise((resolve) => {requests.push(() => {resolve(config)})})} catch (error) {console.error('刷新 token 失败:', error)return Promise.reject(error)}finally {isRefreshing = false; // 标记刷新 token 结束}},logout: () => {const userStore = useUserStore()userStore.logout()}},user: {tokenKey: 'x-token',loginStatus: 401, // 指定后端返回的code,refreshToken为true时会更新tokenrefresh: false, // token是否自动续期getToken: () => {return localStorage.getItem('x-token')},logout: () => {localStorage.removeItem('x-token')}}
}// 更换token
export const refreshToken = async (config: any, systemCode: string) => {if (SYSTEMS[systemCode] && typeof SYSTEMS[systemCode].refreshToken === 'function') {return SYSTEMS[systemCode].refreshToken(config)} else {throw new Error(`系统 ${systemCode} 对应的刷新token方法未定义`)}
}
// 获取token
export 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TOML介绍

0 Preface/Foreword TOML&#xff0c;一种配置文件格式。Toms Obvious Minimal Language. 1 介绍 TOML: Toms Obvious Minimal Language&#xff0c;“显而易见的最小化语言 ” JSON&#xff1a;不支持注释 YAML&#xff1a;过于复杂

python 大数据的优势

在SD-WAN技术与企业网络的应用场景中&#xff0c;结合大数据分析&#xff0c;Python能发挥出独特优势&#xff0c;这些优势主要体现在以下几个方面&#xff1a; - **数据收集与整合**&#xff1a;在SD-WAN网络中&#xff0c;分布着众多设备和链路&#xff0c;会产生海量的网络…

Linux命名管道与共享内存

命名管道与共享内存 命名管道介绍和基本使用 理解了匿名管道后&#xff0c;命名管道的理解就会变得容易。在前面使用匿名管道时可以发现&#xff0c;之所以可以匿名是因为由父进程创建&#xff0c;子进程拷贝所以子进程和父进程都可以看到这个管道。但是如果对于任意两个进程…

TCP 端口号为何位于首部前四个字节?协议设计的智慧与启示

知乎的一个问题很有意思&#xff1a;“为什么在TCP首部中要把TCP的端口号放入最开始的四个字节&#xff1f;” 这种问题很适合我这种搞历史的人&#xff0c;大年初一我给出了一个简短的解释&#xff0c;但仔细探究这个问题&#xff0c;我们将会获得 TCP/IP 被定义的过程。 文…

查看引脚电平

在Linux系统中&#xff0c;通过cat命令查看/sys/class/gpio/export文件并不能直接获取GPIO引脚的高低电平。/sys/class/gpio/export文件用于向系统请求导出&#xff08;即启用&#xff09;某个特定的GPIO引脚&#xff0c;而不是用于读取引脚的状态。 1.导出GPIO引脚&#xff1…

luoguP8764 [蓝桥杯 2021 国 BC] 二进制问题

luogu题目传送门 题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗? 输入格式 输入一行包含两个整数 N 和 K。 输出格式 输出一个整数表示答案。 输入输出样例 输入 #1 7 2 输出 #1 3 说明/提示 对于…

qt的QSizePolicy的使用

使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中&#xff0c;QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为&#xff0c;可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…

GLM库需要VS2013及以上

GLM库简介 GLM(OpenGL Mathematics)是一个C++数学库,它基于OpenGL Shading Language(GLSL)规范。 功能: 矩阵变换和四元数:GLM支持各种矩阵变换操作,包括平移、旋转和缩放。此外,它还提供了四元数支持,这对于处理3D旋转非常有用。 数据打包和随机数生成:除了基本…

八.springboot集成mybatis+druid数据库连接池

文章目录 前言一、添加必要依赖二、添加application-dev.yml配置三、添加mybatisdruid配置三、添加mybatis-config.xml四、测试使用1.在TestController中添加一个testMybatis2.在TestService中添加对应接口3.实现TestService4.最终项目结构5.测试接口 五、Druid监控功能总结 前…

FreeRTOS 知识点总结(一):基础概念与核心特性

FreeRTOS 是一款广泛应用于嵌入式领域的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;以其轻量级、开源性、高可裁剪性等特点&#xff0c;成为许多嵌入式开发项目的首选。本文将从基础概念、核心特性、任务管理等方面对 FreeRTOS 进行总结&#xff0c;帮助初学者快速入…

一文了解zookeeper

1.ZooKeeper是什么 简单来说&#xff0c;她是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务 具体来说&#xff0c;他可以做如下事情&#xff1a; 分布式配置管理&#xff1a;ZooKeeper可以存储配置信息&#xff0c;应用程序可以动态读取配置信息。分布式同步&a…

游戏引擎学习第100天

仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天&#xff0c;我们开始了反射和环境贴图的工作&#xff0c;成功地根据法线显示了反射效果。然而&#xff0c;我们还没有实现反射向量的计算&#xff0c;导致反射交点的代…

MYSQL的管理备份

一、系统数据库 mysql数据库安装完成后,自带了四个数据库,具体作用如下: mysql:存储MySQL服务器正常运行所需的各种信息(时区、主从、用户、权限等); information_schema:提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等; performanc…

【时时三省】(C语言基础)简单的算法举例

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 判定2000—2500年中的每一年是否为闰年&#xff0c;并将结果输出。 本先分析闰年的条件&#xff1a; &#xff08;1&#xff09;能被4整除&#xff0c;但不能被100整除的年份都是闰年&…

基于单片机的智能奶茶机(论文+源码+图纸)

1总体架构设计 本课题为基于单片机的智能奶茶机设计&#xff0c;其系统架构上设计如图2.1所示&#xff0c;整个系统包括了DS18B20温度传感器、继电器模块、LCD液晶、蜂鸣器、按键、STC89C52单片机等器件&#xff0c;在功能上用户可以通过按键键控制选择甜度和添加物以及设置温度…

在线网校教育软件开发助力互联网时代教育发展

互联网时代&#xff0c;在线教育已成为推动教育事业发展的重要力量。开发优质的在线网校教育软件&#xff0c;能够有效整合资源、提升效率、促进公平&#xff0c;为教育发展注入新活力。以下是关键点&#xff1a; 一、 在线网校教育软件的优势 打破时空限制&#xff1a; 学生…

Air724 DTU数据上报json到v1/gateway/telemetry

Air724 DTU数据上报json到v1/gateway/telemetry 任务模板&#xff1a; functionsys.wait(10000)local taskname"userTask"log.info(taskname,"start")local nid 1local netmsg "UART_DATA_TO_NET"..nidwhile true dolocal t{}t.params {} -- …

基于微信小程序的场地预约设计与实现

第3章 系统设计 3.1系统设计目标 本系统的实现可以帮助体育馆场地信息的管理。帮助管理员对注册用户管理以及用户预约管理。同时可以帮助用户进行场地预约。本系统可以实现用户足不出户预约到需要的场地&#xff0c;为用户提供场地信息了解的平台。 3.2系统功能结构图 本系统的…

Kettle开发Jsoup组件进行网页爬取

1. 概述 在当今数据驱动的商业环境中&#xff0c;企业需要从各种来源收集和分析数据以支持决策。网页爬取作为一种数据收集手段&#xff0c;能够从网页中提取有价值的信息。Kettle作为一种强大的ETL工具&#xff0c;结合Jsoup库&#xff0c;可以实现高效、灵活的网页爬取功能。…

C++ Primer 跳转语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…