React-Native中Firebase Realtime Database的once/on/set方法失效
React Native Firebase Realtime Database 仅本地生效,无法同步云端
问题现象
React Native应用中Firebase身份验证正常,但Realtime Database读写异常:
once、on方法完全不触发成功/失败回调,即使云端数据库已有数据- 执行
set操作后,on/once能返回值,但数据不会同步到云端,删除应用数据后即丢失,说明仅本地生效,未与服务器同步
已确认信息
- Realtime Database 部署在 us-central1 区域
- 数据库读写规则设为全开放:
.read和.write均为true - 使用
await reference.once('value')时程序直接卡在该行,无响应 - 能获取正确的
reference对象,google-services.json包含正确Firebase地址(日志已验证) - Firebase身份验证功能正常,配置步骤无误
- 修改Android配置后已执行应用重建和Gradle Build操作
相关代码与配置
App.js
import database from '@react-native-firebase/database'; const App = () => { useEffect(() => { const reference = database().ref('test'); console.log(reference); // 日志打印正确的数据库地址 reference.once( // 无任何返回值 'value', (snapshot) => { console.log('User data: ', snapshot.val()); }, (error) => { console.log('error reading messages', error); } ); }, []); return ( <IconComponentProvider IconComponent={MaterialCommunityIcons}> {/* <AppProvider> <NavigationStack /> </AppProvider> */} </IconComponentProvider> ); };
云端Realtime Database数据
{ "test": "test" // 根节点下的测试数据 }
数据库规则
{ "rules": { ".read": true, ".write": true, } }
项目依赖(package.json)
"dependencies": { "@react-native-firebase/app": "^15.6.0", "@react-native-firebase/auth": "^15.6.0", "@react-native-firebase/database": "^15.6.0", "@react-native-material/core": "^1.3.7", "@react-navigation/bottom-tabs": "^6.3.3", "@react-navigation/drawer": "^6.4.4", "@react-navigation/native": "^6.0.12", "@react-navigation/native-stack": "^6.8.0", "eslint": "^7.32.0 || ^8.2.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-react-native": "^4.0.0", "prettier": "^2.7.1", "react": "18.0.0", "react-native": "0.69.5", "react-native-gesture-handler": "^2.6.0", "react-native-reanimated": "^2.10.0", "react-native-safe-area-context": "^4.3.3", "react-native-screens": "^3.17.0", "react-native-vector-icons": "^9.2.0", "yarn": "^1.22.19" },
Android app/build.gradle 添加的依赖
implementation platform('com.google.firebase:firebase-bom:30.4.1') implementation "com.google.firebase:firebase-core" implementation "com.google.firebase:firebase-auth" implementation "com.google.firebase:firebase-database"
Android 权限配置
<uses-permission android:name="android.permission.INTERNET" />
解决方案建议
1. 手动指定数据库URL
由于数据库部署在us-central1(非默认区域),RN Firebase可能无法自动识别,需手动指定数据库URL:
// 方式1:初始化引用时指定 const reference = database('https://<你的数据库ID>.firebaseio.com').ref('test'); // 方式2:全局初始化时配置 import firebase from '@react-native-firebase/app'; firebase.app().options.databaseURL = 'https://<你的数据库ID>.firebaseio.com';
数据库URL可在Firebase控制台Realtime Database页面获取
2. 对齐Firebase BOM版本兼容性
@react-native-firebase 15.6.0对应推荐的Firebase BOM版本为31.0.0及以上,修改app/build.gradle:
implementation platform('com.google.firebase:firebase-bom:31.0.0')
修改后执行./gradlew clean再重新构建应用。
3. 启用调试日志排查
添加日志查看底层连接状态:
import database from '@react-native-firebase/database'; database().setLoggingEnabled(true);
运行后查看日志,排查是否存在连接失败、权限异常或网络拦截问题。
4. 检查网络与代理
确保测试设备/模拟器能正常访问Firebase服务,避免代理或防火墙阻止Realtime Database的WebSocket/HTTPS连接。
5. 重新验证google-services.json
从Firebase控制台重新下载google-services.json,确认其中database_url字段与数据库URL完全一致,替换后重新构建应用。
内容的提问来源于stack exchange,提问作者B T
相关产品推荐
相关产品推荐

