微信小程序请求拦截器踩坑:避免重复刷新 token

在微信小程序开发中,我们通常会给请求统一加拦截器,处理 token 的过期刷新。

但你可能会遇到一个问题:

接口 A 和接口 B 都需要 token,token 已过期,多接口同时发请求,结果刷新 token 被触发多次,导致请求状态错乱或者失败。

这就是典型的 拦截器踩坑场景。

一、问题场景

假设你的小程序有两个接口:

  • 接口 A:获取用户信息

  • 接口 B:获取用户订单

两者都需要 accessToken。

如果 token 已经过期:

  1. 接口 A 判断 token 过期 → 去刷新 token

  2. 接口 B 几乎同时也判断 token 过期 → 也去刷新 token

结果:

  • 同一时间调用了两次刷新接口

  • 可能刷新结果互相覆盖

  • 请求 A/B 状态可能失败


二、错误做法示例

很多人会在拦截器里写:

javascript 复制代码
function request(config) {
  if (token过期) {
    // 每个请求都去刷新
    await refreshToken();
  }
  return wxRequest(config);
}

问题是:多接口同时发起请求,就会重复刷新 token。

三、正确思路:给刷新操作"加锁"

核心思路:

同一时间,只能有一个请求去刷新 token,其他请求等待它完成

实现步骤

  1. 定义全局变量 refreshTask 保存刷新任务(Promise)。

  2. 当请求发现 token 需要刷新时:

    • 如果 refreshTask 存在 → 等待它完成

    • 如果 refreshTask 不存在 → 创建刷新任务

  3. 刷新完成后 → 清空 refreshTask(释放锁)


简单示例

javascript 复制代码
// 全局锁,保证同一时间只刷新一次
let refreshTask = null;

// 并发安全刷新 token
async function refreshTokenIfNeeded() {
  if (refreshTask) return refreshTask; // 已有人在刷新,等待它

  refreshTask = (async () => {
    await doRefreshToken(); // 实际刷新 token,获取到的token放入缓存中
    refreshTask = null;     // 完成后释放锁
  })();

  return refreshTask;
}

// 封装请求,自动加 token
async function wxRequestWithToken(config) {
  await refreshTokenIfNeeded();  // 请求前确保 token 有效

  return new Promise((resolve, reject) => {
    wx.request({
      ...config,
      header: {
        ...(config.header || {}),
        Authorization: `Bearer ${wx.getStorageSync('accessToken')}` // token 放在请求头
      },
      success: resolve,
      fail: reject
    });
  });
}

四、效果和好处

  • 避免重复刷新 → 减少服务器压力

  • 避免 token 覆盖 → 请求状态稳定

  • 多接口同时发请求 → 自动排队,保证并发安全


五、小结

掌握这个方法后,微信小程序多接口同时请求也不会重复刷新 token,无论是在页面加载时,还是多个组件同时发起请求时,都能保证状态稳定、安全可靠。

相关推荐
省钱兄--zs13 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
李洋-蛟龙腾飞公司13 小时前
微信小程序商城迁移鸿元服务实战
微信小程序·小程序
无限聚核16 小时前
抖音 certificate.prepare 之后怎么验券?和美团 msconsume 差在哪,无限聚核
前端·微信小程序
Autumn_ing17 小时前
AI生成应用能做到哪一步?在线问诊APP从挂号到支付的完整案例
小程序·app·健康医疗·ai应用·问诊app·ai生成应用·墨刀ai
火眼金睛记单词18 小时前
攻克考研英语熟词僻义:解锁高分密码的关键一步
经验分享·考研·小程序
YueLin11119 小时前
直播卖货小程序哪个好用?2026 年三大阵营与适配场景
小程序
拖孩20 小时前
# AI 帮我写的小程序,上线不到一个月流量主突然爆了
前端·后端·微信小程序
IT_陈寒21 小时前
微信小程序:题上岸
微信小程序
m0_587383001 天前
无人自助拼豆系统开发实战指南 核心功能架构搭建与落地经验分享
java·经验分享·spring·小程序·架构·需求分析
Ai-_Man1 天前
DeepSeek生成的内容能否下载吗?
开发语言·javascript·人工智能·小程序·ecmascript