Firestore获取用户事件时遇集合引用无效错误,求解决方案
问题分析与解决
错误原因
你遇到的FirebaseError: Invalid collection reference是因为代码中collection(db, "events", uid)生成的是文档路径(段数为2,偶数),而Firestore要求集合引用的路径段数必须是奇数。这段代码实际指向的是events集合中ID为uid的单个文档,而非你需要的事件集合。
同时你的Firestore规则写法和数据查询逻辑不匹配:原规则匹配的是events集合中ID等于用户uid的单个文档,但你实际要查询的是该用户创建的所有事件文档。
解决方案
1. 修正前端查询代码
将集合引用改为正确的events集合,保留where条件筛选当前用户创建的事件:
import { db } from "../firebase"; import { collection, query, getDocs, where } from "firebase/firestore"; import getCurrentUser from "./CurrentUser"; const getEvents = async () => { // 注意:如果getCurrentUser是异步函数,这里需要改为await getCurrentUser() const uid = getCurrentUser().uid; // 修正集合引用为events根集合 const eventsRef = collection(db, "events"); const que = query(eventsRef, where("creator", "==", uid)); const result = await getDocs(que); return result; }; export default getEvents;
2. 调整Firestore规则
修改规则,让用户只能读取/修改自己创建的事件文档(通过检查文档的creator字段):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /events/{eventId} { // 允许读取、更新、删除自己创建的事件 allow read, update, delete: if request.auth != null && resource.data.creator == request.auth.uid; // 允许创建事件,且创建者必须是当前登录用户 allow create: if request.auth != null && request.auth.uid == request.resource.data.creator; } } }
说明
- 修正后的代码会查询
events集合中所有creator字段等于当前用户uid的文档,符合你的需求。 - 调整后的规则确保用户只能访问自己创建的事件,同时保留了权限控制的安全性。
内容的提问来源于stack exchange,提问作者Zibal
相关产品推荐
相关产品推荐

