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

React Native Firebase Firestore无法保存数据且无报错问题求助

问题描述

我正在使用React Native Firebase和react-native-image-picker实现用户输入数据、选择或拍摄照片后将所有内容保存至Firestore的功能。我在handleCreateTool函数开头添加了打印语句,确认该函数已触发,但.then和.catch块中的日志从未打印,数据也未保存到Firestore。

相关代码

handleCreateTool函数

export const handleCreateTool = (tool: Tool) => {
  console.log('Attempting to create tool: ', tool.name);
  firestore()
    .collection('tools')
    .doc(tool.tid)
    .set({
      tid: tool.tid,
      owner: tool.owner,
      name: tool.name,
      serialNum: tool.serialNum,
      imageUris: tool.imageUris,
      createdAt: tool.createdAt,
      updatedAt: tool.updatedAt,
    })
    .then(() => {
      console.log('Tool created: ', tool.name);
    })
    .catch(err => console.log('Error creating tool: ', err));
};

handleSavePress函数

const handleSavePress = () => {
    const tool: Tool = {
      tid: '123456asdfgh',
      serialNum: '013SN568TGH',
      name: 'Impact Wrench',
      imageUris: [],
      owner: 'Timmy',
      createdAt: new Date().getTime(),
      updatedAt: new Date().getTime(),
    };
    console.log('TOOL: ', tool);
    handleCreateTool(tool);
  };

触发按钮代码

<Pressable
        onPress={() => handleSavePress()}
        style={({ pressed }) => [
          { opacity: pressed ? 0.5 : 1.0 },
          isSaveDisabled ? styles.saveButtonDisabled : styles.saveButton,
        ]}
        disabled={isSaveDisabled}>
        <Text style={styles.saveButtonText}>Save Tool</Text>
      </Pressable>

我也尝试过使用onPress={handleSavePress}的写法,但结果一致:无报错,也无法完成数据保存。另外,我使用完全相同的逻辑(仅修改集合名称和数据)保存用户数据时,功能正常,希望能得到相关排查思路。


排查思路
  • 检查Firestore安全规则:确认tools集合的写权限是否开放。比如当前规则是否只允许认证用户写入,而测试时未登录?或者规则中对tools集合有特殊字段校验要求。可以临时设置宽松规则调试(仅限开发环境):
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if true;
        }
      }
    }
    
  • 改用async/await捕获隐藏错误:将.then/.catch改为async/await写法,可能更容易捕获未被捕获的异常:
    export const handleCreateTool = async (tool: Tool) => {
      try {
        console.log('Attempting to create tool: ', tool.name);
        await firestore()
          .collection('tools')
          .doc(tool.tid)
          .set({
            tid: tool.tid,
            owner: tool.owner,
            name: tool.name,
            serialNum: tool.serialNum,
            imageUris: tool.imageUris,
            createdAt: tool.createdAt,
            updatedAt: tool.updatedAt,
          });
        console.log('Tool created: ', tool.name);
      } catch (err) {
        console.error('Error creating tool: ', err);
      }
    };
    
  • 校验字段类型与Firestore兼容性:确认Tool类型定义的字段和Firestore支持的类型是否匹配,比如createdAt用了毫秒数字,可尝试换成Firestore原生Timestamp类型测试:
    createdAt: firestore.Timestamp.fromDate(new Date()),
    updatedAt: firestore.Timestamp.fromDate(new Date()),
    
  • 检查文档ID合法性:确认tool.tid是否符合Firestore文档ID规则,不能包含/、\、#、[、]、*字符,也不能是空字符串。
  • 查看Firebase控制台日志:前往Firebase控制台的「Firestore -> 规则 -> 规则日志」,检查是否有被拒绝的写入请求;同时在「项目设置 -> 日志」中搜索相关错误信息。
  • 开启Firestore调试模式:初始化Firestore时开启调试日志,查看底层操作细节:
    import firestore from '@react-native-firebase/firestore';
    firestore().settings({ debug: true });
    
  • 确认网络连接状态:检查设备/模拟器的网络是否正常,Firestore在离线状态下会缓存操作,但未联网时.then不会触发(除非启用持久化并等待同步)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:03:39