小小白每天不奋斗 2023-05-17 18:14 采纳率: 80%
浏览 27
已结题

关于#小程序自定义token无感刷新#的问题,如何解决?

小程序自定义的token实现无感刷新
哪位盆友帮我把这段代码改造成可以实现token无感刷新的

const errorToast = function(msg) {
  wx.showToast({
    title: msg || "服务器繁忙,请稍后再试",
    icon: "none"
  })
}
export default function $mHttp (params) {


      wx.showLoading({
   title: params.load_txt || '加载中...',
    mask:params.mask || false
  })
  
  return new Promise((resolve, reject) => {
    wx.request({
      url: params.url,
      data: params.data,
      header: params.header || {
        //"Content-Type": "application/x-www-form-urlencoded",
        "token": wx.getStorageSync("token"),
        "uid": (new Date()).getTime() + '_' + Math.floor(Math.random() * 100000000) //接口请求流水号
      },
      method:  params.method ||'POST' ,
      success: function (res) {
        wx.hideLoading()
        var data = res.data;        
        resolve(data)
      },
      fail: function (e) {
        wx.showModal({
          content: '出现错误:'+e.errMsg
        })
        errorToast();
        reject(e)
      }
    })
  })
}


  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-05-17 18:22
    关注

    参考GPT和自己的思路:关于小程序自定义token无感刷新的问题,可以考虑在发送请求之前检查token是否快过期,如果快过期则重新获取新的token,并将新token存储到缓存中替换旧的token。具体实现可以在请求之前添加拦截器,在拦截器中进行检查和更新。

    以下是一个示例代码:

    // 添加拦截器
    wx.interceptors.request.use(config => {
      // 判断token是否快过期,需要自行根据token过期时间来判断
      if (tokenAlmostExpired()) {
        // 发送请求获取新的token,并替换当前的token
        return refreshToken().then(newToken => {
          config.header.token = newToken;
          return Promise.resolve(config);
        });
      } else {
        return Promise.resolve(config);
      }
    });
    
    export default function $mHttp(params) {
      wx.showLoading({
        title: params.load_txt || '加载中...',
        mask: params.mask || false
      });
    
      return new Promise((resolve, reject) => {
        wx.request({
          url: params.url,
          data: params.data,
          header: {
            "token": wx.getStorageSync("token"),
            "uid": (new Date()).getTime() + '_' + Math.floor(Math.random() * 100000000) //接口请求流水号
          },
          method: params.method || 'POST',
          success: function(res) {
            wx.hideLoading();
            var data = res.data;
            resolve(data);
          },
          fail: function(e) {
            wx.showModal({
              content: '出现错误:' + e.errMsg
            });
            errorToast();
            reject(e);
          }
        });
      });
    }
    

    其中,tokenAlmostExpiredrefreshToken需要根据具体情况实现,分别用于判断当前的token是否即将过期和获取新的token。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 5月17日