React Native应用调用Firestore时无报错闪退,我的代码哪里有问题?
问题原因及修复方案
核心问题点
- 你在Firestore查询的
then回调中执行console.log(document.data),这里document.data是获取文档数据的方法,你没有调用,且console.log的返回值为undefined,最终url变量会被赋值为undefined,apisauce接收到非法的baseURL会触发底层异常,直接导致闪退 - 每次请求触发transform时都会重复执行匿名登录、立即登出的操作,Firebase Auth频繁切换登录状态会触发原生端报错闪退
- 没有校验Firestore返回的文档是否存在,缺失异常兜底逻辑
- 混用
await和then的写法容易出现逻辑遗漏,也会提升排查问题的成本
修复代码
import {create} from 'apisauce'; import auth from '@react-native-firebase/auth'; import firestore from '@react-native-firebase/firestore'; // 缓存baseURL,避免每次请求都重复查询Firestore let cachedBaseURL = null; const apiClient = create({ method: 'POST', }); apiClient.addAsyncRequestTransform(async request => { // 已经缓存过url直接使用,减少重复请求 if (cachedBaseURL) { request.baseURL = cachedBaseURL; return; } try { // 仅在未登录时执行匿名登录,避免频繁切换登录状态 if (!auth().currentUser) { await auth().signInAnonymously(); } const document = await firestore() .collection('service_url') .doc('service_url') .get(); // 校验文档是否存在 if (!document.exists) { throw new Error('service url config not found'); } const urlData = document.data(); // 确认url字段存在 const targetURL = urlData?.url; if (!targetURL) { throw new Error('service url is empty'); } cachedBaseURL = targetURL; request.baseURL = targetURL; // 不要每次请求完就登出,后续请求可以复用登录状态 } catch (error) { console.error('get base url error:', error); // 异常情况下给baseURL赋默认值避免崩溃 request.baseURL = ''; } }); export default apiClient;
额外校验项
- 检查Firebase控制台的匿名登录权限是否已开启
- 检查Firestore的安全规则是否允许匿名用户读取
service_url/service_url文档 - 确认
@react-native-firebase/auth和@react-native-firebase/firestore包版本一致,跨版本不兼容也会导致无日志闪退
内容的提问来源于stack exchange,提问作者Sanaullah Javeid
相关产品推荐
相关产品推荐

