React Native+Firebase:登录可读写、未登录仅读的广告页实现问题
解决React Native + Firebase广告页读取数据的问题
Hey there! Let's break down why you're having trouble reading ad data while being able to write it, and fix it step by step.
首先,你的Firebase规则有个明显的小问题
你提到规则里写了".read": "tru..."——这明显是未完成的语法!Firebase会把这种不完整的字符串当成无效规则,直接拒绝所有读取请求,这大概率是你读不到数据的核心原因。
结合你的需求(所有人可读广告,仅登录用户能创建自己的广告),我们需要把规则补全并细化:
{ "rules": { "users": { "$uid": { "ads": { ".read": true, // 所有人都能读取该用户下的广告内容 ".write": "$uid === auth.uid" // 只有广告所属用户能写入/修改 } } } } }
这个规则既满足了"所有人可读"的需求,又保证了数据写入的安全性——只有登录用户能操作自己uid下的ads节点。
然后,读取路径要匹配你的数据结构
你写入广告的路径是/users/${currentUser.uid}/ads,所以读取时要根据需求选择对应的路径:
场景1:读取当前登录用户自己的广告
如果是要展示用户自己发布的广告,直接用和写入一致的路径即可:
import firebase from 'firebase/app'; import 'firebase/database'; import 'firebase/auth'; // 确保先获取当前用户 const currentUser = firebase.auth().currentUser; if (currentUser) { // 监听当前用户的广告数据变化 firebase.database().ref(`/users/${currentUser.uid}/ads`).on('value', (snapshot) => { const userAds = snapshot.val(); if (userAds) { // 把对象转成数组方便渲染(假设你用对象存储广告) const adsList = Object.values(userAds); console.log('我的广告:', adsList); // 在这里更新React Native的state来渲染广告列表 } else { console.log('还没有发布任何广告'); } }); }
场景2:读取所有用户的广告(给所有访客看)
如果要展示平台上所有用户的广告,需要读取根节点/users,然后遍历每个用户的ads节点:
firebase.database().ref('/users').on('value', (snapshot) => { const allAds = []; snapshot.forEach(userSnapshot => { // 取出每个用户的广告数据 const userAds = userSnapshot.child('ads').val(); if (userAds) { // 把每个广告加入总列表,也可以保留发布者的uid信息 Object.values(userAds).forEach(ad => { allAds.push({ ...ad, publisherUid: userSnapshot.key }); }); } }); console.log('所有广告:', allAds); // 渲染所有广告的列表 });
几个额外的检查点
- 规则修改后,一定要在Firebase控制台点击发布按钮,规则生效可能需要1-2分钟
- 可以用Firebase控制台的规则模拟器测试权限:选择"读取"操作,输入对应的路径,分别模拟"未登录用户"和"登录用户",验证是否能正常访问
- 确保你的React Native项目已经正确初始化了Firebase(包括Auth和Database模块)
内容的提问来源于stack exchange,提问作者Japaleno
相关产品推荐
相关产品推荐

