You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

额外优化建议

  1. 提交表单前强制校验登录状态:
const submitForm = async (imageUrl, caption) => {
  if (!auth.currentUser) {
    alert('请先登录');
    return;
  }
  await uploadPostToFirebase(imageUrl, caption);
}
  1. 组件卸载时清理Firestore监听:
useEffect(() => {
  const unsubscribe = getUsername();
  return () => unsubscribe(); // 组件销毁时取消数据监听
}, []);

内容的提问来源于stack exchange,提问作者Nnorom prince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:39:46