微信小程序请求拦截器踩坑:避免重复刷新 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,无论是在页面加载时,还是多个组件同时发起请求时,都能保证状态稳定、安全可靠。

相关推荐
小码哥0684 小时前
从三甲综合医院到连锁诊所:医院管理小程序的场景化突围逻辑(陪诊系统-陪诊APP-陪诊小程序)
小程序·医院管理系统·陪诊小程序·陪诊系统·陪诊app
2501_916007475 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
正在走向自律6 小时前
用豆包Seed Evolving打造全功能【AI智能记账】小程序,开源可落地
人工智能·小程序·开源·智能记账
小羊Yveesss1 天前
模板建站哪个平台好?模板数量之外还要比较编辑与SEO能力
大数据·人工智能·小程序
2501_916007471 天前
深入理解HTTPS对称与非对称加密机制及Charles抓包实践
网络协议·http·ios·小程序·https·uni-app·iphone
郑州光合科技余经理1 天前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
维双云1 天前
小程序商城制作一个需要多少钱?2026报价明细与成本拆解
小程序
郑州光合科技余经理1 天前
家政预约小程序后端源码深度剖析:支付回调实战
java·开发语言·前端·git·小程序·架构·php
电商API_180079052471 天前
导购比价小程序场景|京东联盟商品详情对接方案|多规格图文拉取技术实操
网络·小程序·网络爬虫
北极糊的狐1 天前
钉钉小程序 Git 版本管理完整流程
git·小程序·钉钉