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

React Native Axios请求报错config.cancelToken未定义

问题背景

开发React Native应用过程中,通过GET请求向服务端发起携带鉴权信息的API调用,经服务端日志确认:请求已被正常处理、鉴权Token有效、接口地址正确、服务端已返回所需数据,错误完全出在客户端侧。
客户端请求catch分支捕获错误信息:

const response = axiosContext.authAxios
  .get("/dashboard")
  .then((res) => {
    console.log(res);
  })
  .catch((error) => {
    console.log(error); // 报错位置:undefined is not an object (evaluating 'config.cancelToken')
  });

业务代码中未主动调用任何Axios取消请求相关逻辑,不清楚错误触发原因。

错误根因

该错误和Axios取消请求能力本身无关,是请求拦截器的异常分支吞错、返回undefined导致的:

  1. Axios请求拦截器要求要么返回合法的请求配置config对象,要么返回Promise.reject()抛出错误,不能返回undefined。
  2. 现有authAxios请求拦截器中,当getSecretValueFor("session_token")读取本地Token抛出异常时,catch分支只打印了错误,没有返回任何值,相当于给Axios内部流程返回了undefined。
  3. Axios后续处理请求流程时,会读取传入config对象的cancelToken属性做请求取消相关逻辑,此时拿到的config是undefined,访问属性时就抛出了对应错误。
  4. 额外隐患:token刷新逻辑refreshAuthLogic的catch分支同样只做了状态重置、没有返回拒绝态Promise,刷新Token失败时也会触发同类错误。
修复方案
  • 修复请求拦截器异常分支逻辑,读取Token失败时不要吞错,返回拒绝态的Promise,保证Axios内部流程能正确接收错误,不会拿到undefined的配置。
    修复后的请求拦截器代码:
authAxios.interceptors.request.use(
  (config) => {
    if (!config.headers.Authorization) {
      return getSecretValueFor("session_token")
        .then((session_token) => {
          config.headers.Authorization = session_token;
          return config
        })
        .catch((error) => {
          console.log(error);
          // 抛出错误,不要返回undefined
          return Promise.reject(error);
        });
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
  • 修复Token刷新逻辑的异常分支,刷新失败时同样返回拒绝态Promise,避免同类错误:
const refreshAuthLogic = (failedRequest) => {
  const data = {
    refreshToken: authContext.authState.refreshToken,
  };

  const options = {
    method: "POST",
    data,
    url: "http://localhost:3000/api/refreshToken",
  };

  return axios(options)
    .then(async (tokenRefreshResponse) => {
      failedRequest.response.config.headers.Authorization =
        "Bearer " + tokenRefreshResponse.data.accessToken;

      authContext.setAuthState({
        ...authContext.authState,
        accessToken: tokenRefreshResponse.data.accessToken,
      });

      await Keychain.setGenericPassword(
        "token",
        JSON.stringify({
          accessToken: tokenRefreshResponse.data.accessToken,
          refreshToken: authContext.authState.refreshToken,
        })
      );

      return Promise.resolve();
    })
    .catch((e) => {
      authContext.setAuthState({
        accessToken: null,
        refreshToken: null,
      });
      // 抛出错误,不要吞错返回undefined
      return Promise.reject(e);
    });
};
  • 额外排查点:代码中authAxios的baseURL存在拼写错误(someAPiIcom应为正确域名),若使用HTTP协议调试,需要提前配置React Native端的明文访问权限,否则会触发网络请求失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:21:24