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

如何从Firestore中获取单个文档?调用get()提示文档不存在如何解决

问题描述

根据Firebase官方文档,使用get()即可非常简便地获取单个文档。

但我的代码运行后始终提示不存在对应文档,可该文档实际是存在的,我的代码如下:

useEffect(() => {

    console.log(user, "This is the user UID:"+user.uid)
    const userDoc = db.collection('usuarios').doc(user.uid);
    const doc = userDoc.get();

    if (!doc.exists) {
        console.log('No such document!');
    }
    
    else {
    userDoc
    .onSnapshot(snapshot => {
      
       const tempData = [];
       snapshot.forEach((doc) => {
         
         const data = doc.data();
         tempData.push(data);
 
       });
       setUserData(tempData);
     })
    }
}, [user]);

以下是console.log()的输出内容:
控制台输出截图

Firebase后台的文档配置如下:
Firebase后台文档截图


问题解答

你的代码存在两处核心错误:

  1. get()是异步API,返回值是Promise对象而非文档快照,你直接读取doc.exists相当于访问Promise实例的exists属性,该属性不存在永远返回false,所以会一直提示文档不存在。
  2. 你监听的是单个文档的快照,返回的snapshot不是集合快照,不需要用forEach遍历,直接调用.data()方法即可拿到文档数据。

一次性拉取文档的正确写法

useEffect(() => {
  // 处理user为空的边界情况
  if (!user?.uid) return
  console.log(user, "This is the user UID:"+user.uid)
  const userDoc = db.collection('usuarios').doc(user.uid);
  // 异步等待get返回结果
  userDoc.get().then(doc => {
    if (!doc.exists) {
      console.log('No such document!');
      return
    }
    setUserData(doc.data())
  }).catch(err => {
    console.error('获取文档失败:', err)
  })
}, [user]);

实时监听文档变动的正确写法

不需要额外调用get(),直接用onSnapshot即可,记得组件卸载时取消监听避免内存泄漏:

useEffect(() => {
  if (!user?.uid) return
  const userDoc = db.collection('usuarios').doc(user.uid);
  // 绑定实时监听,返回取消监听的函数
  const unsubscribe = userDoc.onSnapshot(snapshot => {
    if (!snapshot.exists) {
      console.log('No such document!');
      return
    }
    setUserData(snapshot.data())
  }, err => {
    console.error('监听文档失败:', err)
  })
  // 组件卸载时取消监听
  return unsubscribe
}, [user]);

内容的提问来源于stack exchange,提问作者React Enjoyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:06:03