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

React-Native中Saga带Token获取车辆记录报400错误排查

看起来你遇到的问题是登录能正常拿到Token,但调用车辆列表接口时却提示"No token is present",这种情况大概率是请求中没有正确携带Token或者Token的读取/传递环节出了问题,我来帮你拆解几个最可能的原因和对应的排查方向:

1. 请求头未正确携带Token

这是最常见的原因。登录接口成功后,你需要把Token以服务器要求的格式(通常是Bearer ${token})附加到请求的Authorization头里。如果你的fetchVehicles Saga里的请求没有配置这个头,服务器自然会返回无Token的错误。

举个正确的实现示例,假设你用的是封装后的API实例:

function* fetchVehicles(action) {
  try {
    // 先从存储(比如AsyncStorage或Redux状态)获取Token
    const token = yield call(AsyncStorage.getItem, 'authToken');
    if (!token) {
      throw new Error('No token found in storage');
    }
    // 发起请求时携带Authorization头
    const response = yield call(api.get, '/vehicles', {
      headers: {
        Authorization: `Bearer ${token}` // 注意:部分服务器可能不需要Bearer前缀,直接传token即可
      }
    });
    // 处理成功响应
    yield put(fetchVehiclesSuccess(response.data));
  } catch (error) {
    yield put(fetchVehiclesFailure(error.message));
  }
}

需要重点确认:

  • 请求是否显式添加了Authorization头
  • Token的格式是否完全符合服务器要求(比如是否遗漏Bearer前缀)

2. Token存储或读取环节出错

登录成功后你肯定把Token存起来了(比如AsyncStorage、Redux Store),但在fetchVehicles里读取时可能出了问题:

  • 存储的key和读取的key不一致(比如存的时候用userToken,读的时候用authToken)
  • 读取Token的异步操作未正确处理(比如没加yield,导致拿到的是Promise而非实际Token值)
  • Redux状态里的Token还未更新(比如登录成功的Action还未走完,就提前触发了fetchVehicles)

快速排查方法:在读取Token后添加日志,确认拿到的内容是否正确:

const token = yield call(AsyncStorage.getItem, 'authToken');
console.log('Fetched token for vehicles:', token); // 对比登录时拿到的Token是否一致

3. API实例的拦截器配置问题

如果你封装了全局API实例(比如axios实例),可能登录请求自动带了Token,但车辆列表请求没走这个拦截器,或者拦截器逻辑有问题:

  • 检查拦截器是否正确给所有需要授权的请求添加了Token
  • 确认拦截器里的Token来源逻辑是否正常(比如从存储读取的代码没有bug)

4. 兜底排查:抓包验证请求头

最直接的方式是用React Native Debugger的Network面板抓包,查看fetchVehicles请求的Headers:

  • 如果请求头里完全没有Authorization字段,就是Token携带的问题
  • 如果有该字段但格式不对,就是Token格式不符合服务器要求

内容的提问来源于stack exchange,提问作者0x75aaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:06:51