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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:36:05