React Native生产构建环境下Refresh Token失效问题求助
React Native生产环境Token刷新机制失效排查方案
核心问题
开发环境下Token刷新逻辑正常,生产构建后上传应用商店,触发401时刷新Token的API未被调用,Charles监控无刷新请求记录。
排查方向与解决方案
1. 检查HTTP状态码常量拼写错误
代码中response.statusCode === HttpStatusCode.unathorized存在明显拼写错误:unauthorized少写了字母z。
- 开发环境可能因类型未严格校验或常量值巧合匹配,逻辑正常触发;
- 生产环境编译后,错误的常量名可能对应无效状态码(比如
undefined),无法匹配真实的401状态码,直接跳过刷新逻辑。 - 修复:将
HttpStatusCode.unathorized改为HttpStatusCode.unauthorized,同步校验HttpStatusCode枚举的定义。
2. 排查AsyncStorage存取与解析异常
生产环境中AsyncStorage的行为可能与开发环境存在差异:
- 空值或解析错误:
refreshTokenValue可能为null,执行JSON.parse(refreshTokenValue)时抛出错误,进入catch分支后直接抛出异常,未执行刷新API调用。- 修复:在解析前增加空值校验:
if (!refreshTokenValue) { throw new Error('Refresh token not found'); } const refreshResponse = await this.refreshToken.updateToken({ refresh_token: JSON.parse(refreshTokenValue), });
- 修复:在解析前增加空值校验:
- 存储格式不一致:确认
AsyncStorage中存储的accessToken和refreshToken是否为JSON字符串,若实际存储的是原始字符串,JSON.parse会抛出错误,导致请求头未携带Token,触发401但后续刷新逻辑因异常中断。
3. 生产环境错误类名称被混淆压缩
代码中依赖e.constructor.name匹配错误处理器:
const errorHandler = this.errorHandlers[e.constructor.name];
- 生产构建时,JS压缩工具(如Terser)会混淆类名,自定义错误
RevokedRefreshToken、PaymentRequired的名称可能被改为a、b等短名,导致无法匹配errorHandlers中的键,直接抛出异常中断刷新流程。 - 修复:
- 给自定义错误添加唯一标识属性:
class RevokedRefreshToken extends Error { errorType = 'RevokedRefreshToken'; // ... } - 改为通过标识属性匹配处理器:
const errorHandler = this.errorHandlers[(e as any).errorType];
- 给自定义错误添加唯一标识属性:
4. 验证生产环境HttpClient的响应处理
确认生产环境中HttpClient的实现是否正确返回statusCode:
- 部分HTTP库或自定义拦截器在生产环境可能将401错误包装为异常抛出,而非返回包含
statusCode: 401的HttpResponse对象,导致代码无法进入刷新分支。 - 排查:通过远程日志工具打印
response完整结构,确认statusCode是否正确传递。
5. 补充生产环境异常日志
生产环境默认屏蔽控制台日志,导致刷新逻辑中的异常无法被发现:
- 集成远程日志工具(如Sentry),捕获
catch分支中的异常信息,确认是否有解析错误、网络错误等导致流程中断。
内容的提问来源于stack exchange,提问作者carlosdanieldev
相关产品推荐
相关产品推荐

