如何从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后台的文档配置如下:
问题解答
你的代码存在两处核心错误:
get()是异步API,返回值是Promise对象而非文档快照,你直接读取doc.exists相当于访问Promise实例的exists属性,该属性不存在永远返回false,所以会一直提示文档不存在。- 你监听的是单个文档的快照,返回的
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
相关产品推荐
相关产品推荐

