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

React Native无法向Firebase数据库推送数据及导入方式疑问

问题解答

一、数据无法推送且Promise无响应的原因

你遇到的核心问题是Firebase实例未正确初始化,再加上数据库规则的限制,导致请求完全无法正常执行:

  1. 未使用已初始化的Firebase实例
    你当前代码里用的是import * as firebase from 'firebase'导入的基础firebase包,但这个实例并没有执行firebase.initializeApp(config)初始化操作——你的初始化逻辑是写在自己的单例类里的。未初始化的Firebase实例执行数据库操作时,不会真正向Firebase服务器发送请求,导致Promise一直处于pending状态,既不会resolve也不会reject,自然看不到任何日志输出。

  2. 数据库规则与认证状态冲突
    你的数据库规则设置为:

    {
      "rules": {
        ".read": "auth == null",
        ".write": "auth == null"
      }
    }
    

    这表示只有未登录(auth为null)的用户才能读写数据,但你已经实现了Firebase认证,当用户处于登录状态时,auth对象不为null,此时即使实例正确初始化,写入操作也会被Firebase拒绝,会触发Promise的reject回调。

二、Firebase导入方式的选择

你应该选择导入自己的单例类,也就是import firebase from '../../firebase/firebase',原因如下:

  • 单例类中已经完成了firebase.initializeApp(config)的初始化操作,确保你使用的是一个已配置好的Firebase实例,避免重复初始化或未初始化的问题。
  • 直接导入import * as firebase from 'firebase'会得到一个未初始化的实例,所有数据库/认证操作都无法正常工作,这也是你当前Promise无响应的主要原因。

另外,你提到调试时单例类的firebase未定义,可能是单例类的导出存在问题,参考下面的正确单例写法:

// 示例正确的单例类代码
import * as firebase from 'firebase';
import firebaseConfig from './firebaseConfig'; // 你的Firebase配置文件

// 避免重复初始化
if (!firebase.apps.length) {
  firebase.initializeApp(firebaseConfig);
}

export default firebase;

确保firebase实例被正确导出,且初始化逻辑只执行一次。

修复后的代码示例

修改导入方式,并根据需求调整数据库规则:

  1. 修改Home组件的导入:
// 替换成你的单例类导入路径
import firebase from '../../firebase/firebase';
export default class Home extends React.Component {
  onAddPressed() {
    const p = firebase.database().ref().push().set({
      title: "Hello World!",
      author: "Simon",
      location: "Germany",
      city: "Muenster",
      state: "Germany",
      zip: 48155
    });
    p.then(() => {
      console.log("数据写入成功")
    }).catch((e) => {
      console.log("写入失败:", e)
    })
  }
  // ... 其余render代码不变
}
  1. 调整数据库规则(二选一):
    • 如果允许所有已登录用户写入:
      {
        "rules": {
          ".read": "auth != null",
          ".write": "auth != null"
        }
      }
      
    • 如果需要保持原逻辑(仅允许未登录用户写入),确保操作时用户处于未登录状态。

这样修改后,点击按钮时就能正常触发Promise的回调,成功或失败都会有对应的日志输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:34:47