二次封装axios解决异步通信痛点
为了方便扩展,和增加配置的灵活性,这里将通过封装一个类来实现axios的二次封装,要实现的功能包括:
- 为请求传入自定义的配置,控制单次请求的不同行为
- 在响应拦截器中对业务逻辑进行处理,根据业务约定的成功数据结构,返回业务数据
- 对响应错误进行处理,配置显示对话框或消息形式的错误提示
- 显示全局的loading
- 给get请求加入时间戳,避免缓存
- 取消重复的请求
- 给请求携带token
- token过期时,根据配置决定退出登录或挂起未完成的请求,先去请求更新token的接口,成功后执行挂起的请求
- 遇到浏览器返回特定code码,重新发起请求
- 路由切换时可以取消未完成的请求
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 相关文章:
二次封装axios解决异步通信痛点
为了方便扩展,和增加配置的灵活性,这里将通过封装一个类来实现axios的二次封装,要实现的功能包括: 为请求传入自定义的配置,控制单次请求的不同行为在响应拦截器中对业务逻辑进行处理,根据业务约定的成功数据结构,返回业务数据对响应错误进行处理,配置显示对话框或消息形…...
算法——结合实例了解深度优先搜索(DFS)
一,深度优先搜索(DFS)详解 DFS是什么? 深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树、图的算法。其核心思想是尽可能深地探索分支,直到无法继续时回溯到上一个节点…...
数据结构(考研)
线性表 顺序表 顺序表的静态分配 //线性表的元素类型为 ElemType//顺序表的静态分配 #define MaxSize10 typedef int ElemType; typedef struct{ElemType data[MaxSize];int length; }SqList;顺序表的动态分配 //顺序表的动态分配 #define InitSize 10 typedef struct{El…...
使用SSE协议进行服务端向客户端主动发送消息
1.创建一个SSE配置类: 1.1代码如下:package com.campus.platform.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.AsyncS…...
FastAPI 高并发与性能优化
FastAPI 高并发与性能优化 目录 🚀 高并发应用设计原则🧑💻 异步 I/O 优化 Web 服务响应速度⏳ 在 FastAPI 中优化异步任务执行顺序🔒 高并发中的共享资源与线程安全问题 1. 🚀 高并发应用设计原则 在构建高并发应…...
DFS+回溯+剪枝(深度优先搜索)——搜索算法
目录 一、递归 1.什么是递归? 2.什么时候使用递归? 3.如何理解递归? 4.如何写好递归? 二、记忆化搜索(记忆递归) 三、回溯 四、剪枝 五、综合试题 1.N皇后 2.解数独 DFS也就是深度优先搜索&am…...
在cursor/vscode中使用godot C#进行游戏开发
要在 Visual Studio Code(VS Code)中启动 C#Godot 项目,可以按照以下步骤进行配置: 1.安装必要的工具 • 安装 Visual Studio Code:确保你已经安装了最新版本的 VS Code。 • 安装.NET SDK:下载并安装.NET 7.x SDK(…...
vant4 van-list组件的使用
<van-listv-if"joblist && joblist.length > 0"v-model:loading"loading":finished"finished":immediate-check"false"finished-text"没有更多了"load"onLoad">// 加载 const loading ref(fals…...
介绍 Liquibase、Flyway、Talend 和 Apache NiFi:选择适合的工具
在现代软件开发中,尤其是在数据库管理和数据集成方面,选择合适的工具至关重要。本文将介绍四个流行的工具:Liquibase、Flyway、Talend 和 Apache NiFi,分析它们的应用、依赖以及如何选择适合的工具。 1. Liquibase 简介ÿ…...
攻防世界33 catcat-new【文件包含/flask_session伪造】
题目: 点击一只猫猫: 看这个url像是文件包含漏洞,试试 dirsearch扫出来/admin,访问也没成功(--delay 0.1 -t 5) 会的那几招全用不了了哈哈,那就继续看答案 先总结几个知识点 1./etc/passwd&am…...
Git -> Git配置密钥对,并查看公钥
Git密钥对的核心作用 私钥 (id_rsa) 你的数字身份证:存放在本机 ~/.ssh 目录下必须严格保密(类似银行卡密码),不可泄露或共享用于 解密 来自服务器的加密信息 公钥 (id_rsa.pub) 可公开的验证锁:需要上传到 Git 服…...
淘宝订单列表Fragment转场动画卡顿解决方案
如何应对产品形态与产品节奏相对确定情况下转变为『在业务需求与产品形态高度不确定性的情况下,如何实现业务交付时间与交付质量的确定性』。我们希望通过混合架构(Native 业务容器 Weex 2.0)作为未来交易终端架构的重要演进方向,…...
【ESP32指向鼠标】——icm20948与esp32通信
【ESP32指向鼠标】——icm20948与esp32通信 ICM-20948介绍 ICM-20948 是一款由 InvenSense(现为 TDK 的一部分)生产的 9 轴传感器集成电路。它结合了 陀螺仪、加速度计和磁力计。 内置了 DMP(Digital Motion Processor)即负责执…...
Xcode证书密钥导入
证书干嘛用 渠道定期会给xcode证书,用来给ios打包用,证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中,选择系统。(选登录也行,反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥ÿ…...
Ubuntu安装PgSQL17
参考官网教程,Ubuntu24 apt在线安装Postgres 17 1. 要手动配置 Apt 存储库 # 导入存储库签名密钥: sudo apt install curl ca-certificates sudo install -d /usr/share/postgresql-common/pgdg sudo curl -o /usr/share/postgresql-common/pgdg/apt…...
K8S容器启动提示:0/2 nodes are available: 2 Insufficient cpu.
问题:K8S的容器启动报错0/2 nodes are available: 2 Insufficient cpu. 原因:Pod的资源请求(requests)设置不当:在Kubernetes中,调度器根据Pod的requests字段来决定哪个节点可以运行该Pod。如果一个Pod声明…...
LabVIEW外腔二极管激光器稳频实验
本项目利用LabVIEW软件开发了一个用于外腔二极管激光器稳频实验的系统。系统能够实现激光器频率的稳定控制和实时监测,为激光实验提供了重要支持。 项目背景: 系统解决了外腔二极管激光器频率不稳定的问题,以满足对激光器频率稳定性要求较高…...
笔记6——字典dict(dictionary)
文章目录 字典dict(dictionary)定义特点常用操作1.访问值2.添加键值对3.修改值4.删除键值对5.遍历字典6.合并字典 性能应用场景dict和list的区别 字典dict(dictionary) 以 键 - 值对 (key - value pairs)的形式存储数据 定义 字典使用花括号 {} 来定义,键和值之…...
【MySQL】InnoDB单表访问方法
目录 1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】all 4、总结 1、背景 mysql通过查询条件查询到结果的过程就叫访问方法,一条查询语句的访问方法有很多种,接下来我们就来讲一下各种访问方法。 2、环境 创…...
APP端网络测试与弱网模拟!
当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使…...
如何高效清理游戏平台残留文件:SteamCleaner一站式解决方案指南
如何高效清理游戏平台残留文件:SteamCleaner一站式解决方案指南 【免费下载链接】SteamCleaner :us: A PC utility for restoring disk space from various game clients like Origin, Steam, Uplay, Battle.net, GoG and Nexon :us: 项目地址: https://gitcode.c…...
连接器选型三张“底牌”:电源、高速、射频的隐性代价与系统级权衡
当产品进入量产阶段,连接器往往是“压死骆驼的最后一根稻草”。它不像芯片那样有明确的数据手册边界,也不像PCB那样可归咎于Layout规则。连接器的失效模式高度依赖“配合状态”——插拔了几次?压接用了什么工具?相邻器件发热多少&…...
云计算Linux——nginx httpd后端 配置 反向代理(十二)
一、反向代理核心原理与作用补充: 正向代理: VPN 反向代理: 访问网站(动态任务)1.什么是反向代理?反向代理是服务器端的代理。客户端访问反向代理服务器,由代理服务器将请求转发给后 端真实服务器…...
AI写专著全攻略:从构思到完稿,快速生成20万字专著
学术专著写作困境与AI工具解决方案 学术专著的生命力源于其逻辑的严谨性,但在写作过程中,逻辑论证往往是最容易出现问题的部分。专著的写作必须围绕核心观点展开系统的论证,要不仅深入阐述每一个论点,还需要应对来自不同学派的争…...
GetQzonehistory:3分钟永久备份你的QQ空间青春回忆,告别数据丢失焦虑
GetQzonehistory:3分钟永久备份你的QQ空间青春回忆,告别数据丢失焦虑 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经担心过QQ空间里那些珍贵的青春回…...
3步实现智能自动化:三月七小助手如何每天为你节省90分钟游戏时间?
3步实现智能自动化:三月七小助手如何每天为你节省90分钟游戏时间? 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否每天花费大量时间在《…...
GE模型加载卸载API
模型加载和卸载 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow…...
3步快速部署GitHub中文化插件:告别英文界面的烦恼
3步快速部署GitHub中文化插件:告别英文界面的烦恼 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾经因为GitHub的…...
【信息科学与工程学】【人工智能】【数字孪生】【游戏科学】主要数学模型-第九篇 计算神经科学
认知神经科学的几何、拓扑与计算建模框架 这是一个深度交叉领域的问题,我将从几何表示、拓扑结构、动力学模型和仿真算法四个维度,系统梳理从神经元到全脑的计算神经科学建模方法。 一、神经元与连接的几何表示模型 神经元形态的表示: a) 线表示:将神经元的树突和轴突表示…...
上午题_结构化开发
耦合基础知识...
