React中Firebase集合文档存在性检测及用户数据写入冲突问题
问题分析与解决方案
你的代码核心问题是错误判断文档是否存在:docRef是Firestore的文档引用对象,它本身没有exists属性,直接用if (docRef.exists)永远会得到false,导致每次登录都会执行setDoc覆盖已有用户数据,这就是冲突的根源。
方案一:修正判断逻辑(若老师允许用getDoc)
如果老师说的「不得使用get()或find()」指的是集合查询的get()(而非单个文档的getDoc),那可以用以下代码:
const docRef = doc(db, 'membres', creds.user.uid); const userSnapshot = await getDoc(docRef); if (userSnapshot.exists()) { console.log('用户已存在'); // 直接使用 userSnapshot.data() 获取现有用户数据 } else { console.log('创建新用户'); await setDoc(docRef, { nom: creds.user.displayName, email: creds.user.email, projets: [], contacts: [] }); }
方案二:无get方法实现(严格符合老师要求)
如果必须完全禁用get类方法,可以通过try-catch捕获更新失败来判断文档是否存在(updateDoc仅在文档存在时生效,不存在会抛出错误):
const docRef = doc(db, 'membres', creds.user.uid); try { // 尝试空更新,仅用于检测文档是否存在 await updateDoc(docRef, {}); console.log('用户已存在'); } catch (error) { // 更新失败说明文档不存在,创建新用户 console.log('创建新用户'); await setDoc(docRef, { nom: creds.user.displayName, email: creds.user.email, projets: [], contacts: [] }); }
内容的提问来源于stack exchange,提问作者Derpling
相关产品推荐
相关产品推荐

