Firebase Firestore提交帖子遇错误,求排查(v9.9.2)
错误排查与修复方案
错误1:FirebaseError: 无效的文档引用。文档引用必须有偶数个段
原因
uploadPostToFirebase函数存在严重语法错误:
- 错误地将
doc(db, 'users', auth.currentUser.email)、collection(db, 'posts')和addDoc()混写,导致Firebase解析引用时格式混乱,触发“偶数段”错误。 addDoc是一次性写入操作,不需要unsubscribe,错误的赋值逻辑引发额外类型错误。
修复后的uploadPostToFirebase函数
const uploadPostToFirebase = async (imageUrl, caption) => { // 前置检查:用户已登录且用户信息加载完成 if (!auth.currentUser || !currentLoggedInUser) return; try { await addDoc(collection(db, 'posts'), { imageUrl: imageUrl, user: currentLoggedInUser.username, profile_picture: currentLoggedInUser.profilePicture, owner_uid: auth.currentUser.uid, caption: caption, createdAt: serverTimestamp(), likes: 0, likes_by_users: [], comments: [] }); navigation.goBack(); } catch (err) { console.error('上传帖子失败:', err); } }
错误2:TypeError: t is not an Object. (evaluating "_delegate" in t)
原因
getUsername函数中onSnapshot调用不符合Firebase v9模块化语法:
where条件参数顺序颠倒(正确顺序为where(字段名, 操作符, 值),你错误地将值放在了字段名位置)。- 未用
query()组合查询条件,直接传递多个参数给onSnapshot,导致Firebase无法解析查询对象。 - 未处理
auth.currentUser为null的情况,可能在未登录时引发uid访问错误。
修复后的getUsername函数
const getUsername = () => { const user = auth.currentUser; if (!user) return () => {}; // 用户未登录时返回空的取消订阅函数 // 构建正确的查询:匹配users集合中owner_uid等于当前用户uid的文档 const q = query( userRef, where('owner_uid', '==', user.uid), limit(1) ); // 正确调用onSnapshot监听数据 const unsubscribe = onSnapshot(q, (snapshot) => { if (!snapshot.empty) { const doc = snapshot.docs[0]; setCurrentLoggedInUser({ username: doc.data().username, profilePicture: doc.data().profile_picture }); } }); return unsubscribe; }
额外优化建议
- 提交表单前强制校验登录状态:
const submitForm = async (imageUrl, caption) => { if (!auth.currentUser) { alert('请先登录'); return; } await uploadPostToFirebase(imageUrl, caption); }
- 组件卸载时清理Firestore监听:
useEffect(() => { const unsubscribe = getUsername(); return () => unsubscribe(); // 组件销毁时取消数据监听 }, []);
内容的提问来源于stack exchange,提问作者Nnorom prince
相关产品推荐
相关产品推荐

