React Native无法向Firebase数据库推送数据及导入方式疑问
一、数据无法推送且Promise无响应的原因
你遇到的核心问题是Firebase实例未正确初始化,再加上数据库规则的限制,导致请求完全无法正常执行:
未使用已初始化的Firebase实例
你当前代码里用的是import * as firebase from 'firebase'导入的基础firebase包,但这个实例并没有执行firebase.initializeApp(config)初始化操作——你的初始化逻辑是写在自己的单例类里的。未初始化的Firebase实例执行数据库操作时,不会真正向Firebase服务器发送请求,导致Promise一直处于pending状态,既不会resolve也不会reject,自然看不到任何日志输出。数据库规则与认证状态冲突
你的数据库规则设置为:{ "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实例被正确导出,且初始化逻辑只执行一次。
修复后的代码示例
修改导入方式,并根据需求调整数据库规则:
- 修改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代码不变 }
- 调整数据库规则(二选一):
- 如果允许所有已登录用户写入:
{ "rules": { ".read": "auth != null", ".write": "auth != null" } } - 如果需要保持原逻辑(仅允许未登录用户写入),确保操作时用户处于未登录状态。
- 如果允许所有已登录用户写入:
这样修改后,点击按钮时就能正常触发Promise的回调,成功或失败都会有对应的日志输出。
内容的提问来源于stack exchange,提问作者rajat44

