如何在Firestore Web模块化API中获取用户公开数据并适配安全规则
问题与解决过程
原配置
我的Firestore用户数据库结构分为users/{userID}/public和users/{userID}/private/**层级,配置的安全规则如下:
match /users/{userID} { match /public { allow read: if request.auth != null; } match /private/{document=**} { allow read: if request.auth.uid == userID; } }
遇到的问题
我需要仅获取用户的公开数据而非全部数据,但使用Firebase Web Modular API时遇到阻碍:旧版本API的.select()字段筛选函数不兼容当前模块化API,且ChatGPT生成的尝试代码无法正常运行,代码如下:
export const getUserFromHashedUID = async (hashedUID, fields) => { const db = getFirestore(); // const userDocRef = doc(collection(db, 'users', hashedUID), 'public'); const userPublicCollectionRef = collection(db, 'users', hashedUID, 'public'); const userDocRef = doc(userPublicCollectionRef, 'public'); try { const docSnapshot = await getDoc(userDocRef); if (docSnapshot.exists()) { const publicData = fields.reduce((acc, field) => { acc[field] = docSnapshot.get(field); return acc; }, {}); console.log(publicData); } else { console.log('No such document!'); } } catch (error) { console.error('Error getting document:', error); } };
注:这段代码对public路径的引用逻辑有误,导致无法正确定位到目标文档。
最终解决方案:调整数据库结构
我将数据库结构调整为直接在users集合下创建{userID}-public和{userID}-private文档,结构示例如下:
users:{ "1234567-private":{"data":"data"}, "1234567-public":{"data":"data"}, "9876543-private":{"data":"data"}, "9876543-public":{"data":"data"}, }
该结构在数据读取效率上与原结构持平,且能完美适配安全规则——只需修改规则,让{userID}-public允许任意已认证用户读取,{userID}-private仅对应用户UID可读取即可。
内容的提问来源于stack exchange,提问作者oredgaming
相关产品推荐
相关产品推荐

