当前位置: 首页 > article >正文

uni-app 全局请求封装:支持 Promise,自动刷新 Token,解决 401 过期问题

uni-app 中封装一个全局通用的 ajax 请求函数,支持 Promise,使用 uni.request() 进行请求,并且具备 自动刷新 token 的功能。以下是详细步骤:


实现步骤

  1. 创建 request.js 统一封装 ajax 请求
  2. 管理 token(存储、获取、刷新)
  3. 处理 401(登录过期)自动刷新 token
  4. 防止 token 过期时多个请求同时触发 refresh_token
  5. 错误处理和 Promise 封装

完整代码

创建 utils/request.js 作为 uni.request 的封装:

utils/request.js

// 导入 uni-app 的 storage API
const BASE_URL = 'https://api.example.com'; // 你的后端接口地址let isRefreshing = false; // 是否正在刷新 token
let refreshSubscribers = []; // 存储刷新 token 期间的请求/*** 刷新 token 并返回新的 token*/
function refreshToken() {if (isRefreshing) {// 如果已经在刷新 token,则返回一个等待的 Promisereturn new Promise((resolve) => {refreshSubscribers.push(resolve);});}isRefreshing = true;return new Promise((resolve, reject) => {uni.request({url: `${BASE_URL}/auth/refresh`, // 刷新 token 的 APImethod: 'POST',header: {'Authorization': `Bearer ${uni.getStorageSync('refreshToken')}` // 发送 refreshToken},success: (res) => {if (res.data.code === 200) {const newToken = res.data.data.token;const newRefreshToken = res.data.data.refreshToken;// 存储新的 token 和 refreshTokenuni.setStorageSync('token', newToken);uni.setStorageSync('refreshToken', newRefreshToken);// 让所有等待的请求继续refreshSubscribers.forEach((callback) => callback(newToken));refreshSubscribers = [];resolve(newToken);} else {reject('Refresh Token Failed');}},fail: (err) => reject(err),complete: () => {isRefreshing = false;}});});
}/*** 统一请求封装* @param {Object} options* @param {String} options.url 请求地址(不含 BASE_URL)* @param {String} [options.method='GET'] 请求方法* @param {Object} [options.data={}] 请求参数* @param {Object} [options.header={}] 请求头* @param {Boolean} [options.auth=true] 是否需要携带 token*/
function request({ url, method = 'GET', data = {}, header = {}, auth = true }) {return new Promise((resolve, reject) => {// 获取存储的 tokenlet token = uni.getStorageSync('token');// 组装请求头let finalHeader = {'Content-Type': 'application/json',...header};if (auth && token) {finalHeader['Authorization'] = `Bearer ${token}`;}uni.request({url: `${BASE_URL}${url}`,method,data,header: finalHeader,success: async (res) => {if (res.statusCode === 200) {resolve(res.data);} else if (res.statusCode === 401 && auth) {// token 失效,自动刷新 tokentry {const newToken = await refreshToken();finalHeader['Authorization'] = `Bearer ${newToken}`;// 重新发起请求uni.request({url: `${BASE_URL}${url}`,method,data,header: finalHeader,success: (retryRes) => resolve(retryRes.data),fail: (retryErr) => reject(retryErr)});} catch (error) {reject('登录状态失效,请重新登录');uni.removeStorageSync('token');uni.removeStorageSync('refreshToken');uni.reLaunch({ url: '/pages/login/login' });}} else {reject(res.data);}},fail: (err) => {reject(err);}});});
}export default request;

使用方式

pages/index/index.vue 页面调用封装的 request.js

import request from '../../utils/request.js';request({url: '/user/info',method: 'GET'
}).then(res => {console.log('用户信息:', res);
}).catch(err => {console.error('请求失败:', err);
});

核心功能解读

  1. 支持 Promise,简化 then/catch 处理
  2. 全局 request 统一封装,避免每个请求都写 uni.request
  3. 自动携带 token,401 过期自动刷新
  4. 防止多个请求同时触发 refreshToken,队列处理
  5. refresh_token 失效,清除 token 并跳转到 login 页面

优化建议

  • 错误信息细化:根据后端 code 细分错误(如 403500)。
  • 可配置 BASE_URL:放到 config.js,区分 devprod 环境。
  • 超时处理:可加 setTimeout 限制请求时间。

这样,uni-app 就具备了全局 ajax 请求封装,且能自动刷新 token,提升开发效率! 🚀

相关文章:

uni-app 全局请求封装:支持 Promise,自动刷新 Token,解决 401 过期问题

在 uni-app 中封装一个全局通用的 ajax 请求函数,支持 Promise,使用 uni.request() 进行请求,并且具备 自动刷新 token 的功能。以下是详细步骤: 实现步骤 创建 request.js 统一封装 ajax 请求管理 token(存储、获取、…...

IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程

背景:最近DeepSeek比较火嘛,然后在githup上也看到了GitHub Copilot,就想着现在AI的准确率已经可以提高工作效率了。所以从网上找了一些编程插件,发现Proxy支持的模型比较多,通用性和适配性比较好。所以本文记录一下pro…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.1.2字段类型选择:keyword vs text、nested对象

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 第2章 数据建模与高效写入:ES字段类型选择最佳实践:keyword vs text与nested对象深度解析1. 索引设计核心原则2. keyword与text类型终极对决2.1 核心…...

【前端基础】Day 3 CSS-2

目录 1. Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 2. CSS的复合选择器 2.1 后代选择器 2.2 子选择器 2.3 并集选择器 2.4 伪类选择器 2.4.1 链接伪类选择器 2.4.2 focus伪类选择器 2.5 复合选择器总结 3. CSS的元素显示模式 3.1 什么是元素显示…...

windows电脑上安装llama-factory实现大模型微调

一、安装环境准备 这是官方给的llama-factory安装教程,安装 - LLaMA Factory,上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装,但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…...

汽车无人驾驶系统中的防撞设计

一、系统方案介绍 无人驾驶汽车的防撞系统是保障行车安全的核心模块,本文设计的系统以STM32F103C8T6单片机为主控制器,结合超声波测距、WiFi通信、人机交互等模块,实现障碍物实时检测、动态阈值设置、多级报警和数据可视化功能。系统通过软…...

sql server 版本更新日期

SQL Server 2019 内部版本(KB4518398) - SQL Server | Microsoft Learn SQL Server 的最新更新和版本历史记录 - SQL Server | Microsoft Learn sql server 2019 版本更新时间和补丁版本号...

Linux网络 DNS

DNS(Domain Name System) TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 , 但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串 , 并且使用 hosts 文件来描述主机名和 IP 地址的关系 。 最初 , 通过互连网信息中…...

EMQX中不同端口对应的接入协议

使用tcp接入时应使用mqtt://IP:1883 使用ws接入时应使用ws://IP:8083...

SpringBoot原理-03.自动配置-方案

一.自动配置原理 探究自动配置原理,就是探究spring是如何在运行时将要依赖JAR包提供的配置类和bean对象注入到IOC容器当中。我们当前准备一个maven项目itheima-utils,这里面定义了bean对象以及配置类,用来模拟第三方提供的依赖,首…...

Python 如何实现烟花效果的完整代码

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...

Winbox5怎样设置上网

要让连接到交换机的设备都能上网,需在MikroTik路由器(通过WinBox配置)上完成以下步骤。假设您的网络拓扑是:外网IP配置在路由器的WAN口,内网设备通过交换机连接到路由器的LAN口。 步骤 1:配置内网接口&…...

(KTransformers) RTX4090单卡运行 DeepSeek-R1 671B

安装环境为:ubuntu 22.04 x86_64 下载模型 编辑文件vim url.list 写入如下内容 https://modelscope.cn/models/unsloth/DeepSeek-R1-GGUF/resolve/master/DeepSeek-R1-Q4_K_M/DeepSeek-R1-Q4_K_M-00001-of-00009.gguf https://modelscope.cn/models/unsloth/Dee…...

【软考-架构】1.2、指令系统-存储系统-cache

GitHub地址:https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 指令系统 计算机指令执行过程:取指令一一分析指令一一执行指令三个步骤,首先将程序计数器PC中的指令地址取出,送入地址总线,CPU依据…...

CI/CD与容器化技术核心知识点的QA

CI/CD与容器化技术核心知识点的Q&A 以下是CI/CD和容器化技术的经典必考面试题及详解,结合行业实践与理论核心整理而成: 一、CI/CD核心概念与流程 简述CI/CD的核心目标与实现价值 答案:通过自动化流水线实现快速、可靠的软件交付,减少人工干预,提升开发与运维协作效率…...

动态规划刷题

文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示:dp[i],表示dp表中i下标位置的值 2. 状态转移方程:以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] …...

不谓侠--记录

音乐《不谓侠》 衣襟上 别好了晚霞 余晖送我牵匹老马 正路过 烟村里人家 恰似当年故里正飞花 醉过风 喝过茶 寻常巷口寻个酒家 在座皆算老友 碗底便是天涯 天涯远 无处不为家 蓬门自我也像广厦 论意气 不计多或寡 占三分便敢自称为侠 刀可捉 拳也耍 偶尔闲来…...

2025-03-01 学习记录--C/C++-C语言 整数类型对比

C语言 整数类型对比 类型位数范围(有符号)范围(无符号)格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…...

Python核心技术,Django学习基础入门教程(附环境安装包)

文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...

MFC中CMutex类和CSingleLock类,配合使用疑惑

在使用CMutex过程中,看到别人使用了CSingleLock类,想着明明CMutex已经可以实现线程同步了,为什么还有使用CSingleLock类呢? 在MFC中,虽然CMutex类本身可以实现线程同步,但通常会与CSingleLock类一起使用&am…...

爬虫系列之【数据解析之正则】《二》

目录 前言 一、正则基本使用 1.1 导包 1.2 接口方法 1.3 换行匹配问题 二、实战案例 完整代码 前言 在爬虫工作中,我们主要会遇到两种类型的文本数据: JSON格式数据 HTML文档数据 对于JSON字符串数据,通常使用Python的字典操作进行键…...

HTML AI 编程助手

HTML AI 编程助手 引言 随着人工智能技术的飞速发展,编程领域也迎来了新的变革。HTML,作为网页制作的基础语言,与AI技术的结合,为开发者带来了前所未有的便利。本文将探讨HTML AI编程助手的功能、应用场景以及如何利用它提高编程…...

RFID工具柜DW-G104R|智能存储,便捷高效

一、行业背景 RFID智能工具柜(DW-G104R)RFID工具管理柜是一种结合RFID技术和智能柜设备的新型工具管理设施,通过自动化管理可以提高工具管理的效率和准确性。 在工业生产中,工具柜是工具存储和管理的重要设备。传统工具柜存在管…...

【前端面试】如何不通过正则:验证IP地址合法性

前言 在 Web 开发中,验证用户输入的 IP 地址是否合法是一个常见需求 面试中也会问到 通常,我们会使用正则表达式来完成这个任务,因为它简洁高效。然而,正则表达式对于初学者来说可能有些晦涩难懂。本文将介绍一种不使用正则表达…...

中间件专栏之Redis篇——Redis的三大持久化方式及其优劣势对比

Redis是内存数据库,它的数据一般存放在内存中,一旦断电或者宕机,存在内存中的数据就会丢失。当然,它也具备数据持久化的能力,本文就将介绍Redis的三种持久化方式及其优劣势对比。 一、RDB(Redis Database&…...

Linux软连接与时区日期

软连接 使用ln命令创建软连接。 在系统中创建软连接,可以将文件,文件夹连接到其他为止。 类似于Windows系统的快捷方式。 语法:ln -s 参数1 参数2 -s选项,创建软连接。 参数1,被链接的文件或文件夹。 参数2&#xff0…...

安全测试之五:SQL Server注入漏洞几个实例

示例 1:在 GET 请求中测试 SQL 注入 最简单且有时最有效的情况是针对登录页面进行测试。当登录页面请求用户输入用户名和密码时,攻击者可以尝试输入以下字符串 “ or 11”(不包含双引号): https://vulnerable.web.ap…...

2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip

2024ChatGPT大模型技术场景与商业应用视频精讲合集,共十三章,45课。 01. 第一章 ChatGPT:通用人工智能的典范 1.1 ChatGPT概述 .mp4 1.2 通用能力 .mp4 1.3 通用人工智能风口 .mp4 02. 第二章 大模型:ChatGPT的核心支撑 2.1 底层…...

HTTP四次挥手是什么?

四次挥手,这是TCP协议用来关闭连接的过程。四次挥手是确保两个主机之间能够安全、可靠地关闭连接的重要机制。我会用简单易懂的方式来讲解,帮助你理解它的原理和过程。 1. 什么是四次挥手? 定义 四次挥手是TCP协议用来关闭连接的过程。它通…...

前端内存泄漏的几种情况及方案

前端内存泄漏是常见但容易被忽视的问题,可能导致页面卡顿、崩溃或性能下降。以下是几种典型场景及解决方案: 1. 未清理的全局变量 场景: 意外创建全局变量(未使用 var/let/const)。主动挂载到 window 的大对象未释放…...