Firebase中如何以user.uid为ID在首次登录时添加用户文档?
问题解决思路
1. 解释addDoc报错的原因
addDoc的作用是给集合添加自动生成ID的文档,无法用来指定ID创建文档。你写的collection(db, "UsersData", user.uid)其实是试图构造UsersData集合下user.uid文档的子集合引用,这和你要在UsersData集合下直接创建指定ID文档的需求不符。另外Firebase要求文档引用的路径段数必须是偶数(集合→文档→子集合→子文档……),而你构造的路径段数是奇数,所以触发报错。
2. 核心需求的解决方案:仅首次登录创建文档
你之前用setDoc的问题在于每次登录都执行,会把用户修改过的username重置为空。要实现仅首次登录创建文档,后续登录不修改已有内容,可以先检查文档是否存在,不存在时再执行创建:
// 获取用户文档引用 const userDocRef = doc(db, "UsersData", user.uid); // 检查文档是否存在 const docSnapshot = await getDoc(userDocRef); if (!docSnapshot.exists()) { // 仅首次登录时创建文档 await setDoc(userDocRef, { username: "", isAdmin: false, user: JSON.parse(JSON.stringify(user)) }); }
这样后续登录时,因为文档已经存在,不会执行setDoc,也就不会覆盖用户之前通过updateDoc修改的username等字段。
补充说明
如果需要在后续登录时更新user字段(比如用户Auth信息有变化),但保留username和isAdmin的现有值,可以用setDoc的merge选项,只传入需要更新的字段:
await setDoc(userDocRef, { user: JSON.parse(JSON.stringify(user)) }, { merge: true });
这样只会更新user字段,不会影响已修改的username和isAdmin。
内容的提问来源于stack exchange,提问作者Mintee
相关产品推荐
相关产品推荐

