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导致的:
- Axios请求拦截器要求要么返回合法的请求配置
config对象,要么返回Promise.reject()抛出错误,不能返回undefined。 - 现有
authAxios请求拦截器中,当getSecretValueFor("session_token")读取本地Token抛出异常时,catch分支只打印了错误,没有返回任何值,相当于给Axios内部流程返回了undefined。 - Axios后续处理请求流程时,会读取传入config对象的
cancelToken属性做请求取消相关逻辑,此时拿到的config是undefined,访问属性时就抛出了对应错误。 - 额外隐患: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
相关产品推荐
相关产品推荐

