You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中JWT客户端令牌刷新失效问题排查求助

解决React Native中JWT令牌刷新失效的问题

你遇到的令牌刷新失效问题,主要有两个核心原因:catch块里的异步逻辑没有执行,以及RefreshToken函数本身没有正确返回结果。我来帮你一步步排查并修正:

第一个问题:Catch块里的异步代码未执行

你在catch中定义了一个async () => {}箭头函数,但只是定义了它却没有调用,而且也没有把这个异步操作的结果return出去,导致这段刷新令牌的逻辑完全不会运行。

第二个问题:RefreshToken函数未返回正确结果

你的RefreshToken函数里,try块最后没有returninstance.post的结果,导致函数默认返回undefined。这就意味着你调用await this.RefreshToken()时拿到的是undefined,自然无法判断刷新是否成功。


先修正RefreshToken函数

export async function RefreshToken() {
  try {
    const ref_token = await SInfo.getItem('ref_token');
    // 直接return请求Promise,让函数返回正确的异步结果
    return instance
      .post(
        '/refresh_token/',
        qs.stringify({
          refresh: ref_token,
        }),
      )
      .then(({data}) => {
        if (!data.error) {
          SInfo.setItem('token', data.token.access, {});
          SInfo.setItem('ref_token', data.token.refresh, {});
          return {result: true, token: data.token.access};
        } else {
          return {result: false, token: ''};
        }
      })
      .catch(error => {
        return {result: false, token: ''};
      });
  } catch (err) {
    // 处理获取ref_token失败的边界情况
    return {result: false, token: ''};
  }
}

再修正Get函数的Catch逻辑

let result = await instance
  .get(url)
  .then(({data}) => {
    if (data.error) {
      return {data: data.message, error: true, redirect: false};
    }
    return {data: data.data, error: false, redirect: false};
  })
  .catch(async err => {
    // 用可选链避免err.response不存在的报错
    if (err.response?.status === 401) {
      // 直接调用RefreshToken并等待结果
      const res = await RefreshToken();
      if (res.result) {
        // 刷新成功后重试请求,必须return这个重试的Promise
        return Get(url, withToken);
      } else {
        return {data: '', error: true, redirect: true};
      }
    } else {
      return {data: 'Process Error', error: true, redirect: false};
    }
  });

额外注意事项

  1. 确保你的instance(比如axios实例)的请求拦截器会实时从SInfo获取最新token,这样刷新后的新令牌才能被用到重试的请求里。
  2. 防止重复刷新:如果多个请求同时触发401,会重复调用RefreshToken,建议加一个全局锁(比如用一个布尔变量标记是否正在刷新),避免重复请求刷新接口。

内容的提问来源于stack exchange,提问作者Jack Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:21