Firestore拒绝创建集合权限问题求助:React客户端登录后无法写入Firestore
嘿,我仔细看了你的问题和代码,发现核心问题其实是你混淆了Firebase Realtime Database和Firestore的API调用——虽然你给Firestore设置了全开放规则,但你的写入代码其实在操作实时数据库,根本没碰Firestore!
问题拆解
你在createUserRoles函数里写的这段代码:
const editorsRef = firebase.database().ref("editors"); editorsRef.push(editor);
是针对Firebase实时数据库的操作,这也是为什么你说初始化实时数据库后功能能正常运行的原因。但你真正想操作的是Firestore,却完全没用到对应的Firestore写入API。
另外还有个小细节:email: "user.email"这里是字符串字面量,不是读取传入的user变量的邮箱属性,应该改成email: user(因为你传入的newEditor就是用户邮箱)。
修正方案
1. 替换为Firestore的写入API
修改createUserRoles函数,用Firestore专属的API来完成写入:
const createUserRoles = (userEmail) => { console.log("hello from createeee"); // 初始化Firestore实例 const db = firebase.firestore(); // 向editors集合添加文档(这里用用户邮箱作为文档ID,也可以用add()自动生成ID) db.collection("editors").doc(userEmail).set({ email: userEmail, role: "reviewer", lastSession: Date.now(), }) .then(() => { console.log("用户角色已成功写入Firestore"); }) .catch((error) => { console.error("写入Firestore失败: ", error); }); };
如果不需要自定义文档ID,把doc(userEmail).set(...)换成add(...)即可自动生成ID。
2. 确认Firestore规则已发布
虽然你写了全开放规则,但要确保你已经在Firebase控制台点击了发布按钮——修改规则后不发布,系统还是会沿用旧规则,这也是常见的权限错误诱因。
3. 检查Firestore初始化(可选)
确保你的React项目里已经正确初始化了Firestore,比如:
// 初始化Firebase App(你应该已经有这段配置) const firebaseConfig = { // 你的Firebase配置信息 }; firebase.initializeApp(firebaseConfig); // 初始化Firestore实例 const db = firebase.firestore();
补充说明
你之前能读取Firestore但不能写入,是因为读取用了正确的Firestore API,而写入操作根本没触碰到Firestore,相当于一直在操作实时数据库,所以才会误以为是Firestore的权限问题。换成Firestore的写入API后,配合你设置的全开放规则,应该就能正常写入了。
内容的提问来源于stack exchange,提问作者Jacopo

