如何从Firestore集合获取文档ID?当前仅硬编码ID可获取数据
问题分析与解决方案
你的问题核心出在两点:
fetchData函数声明了接收id参数,但调用时没传值,导致函数内部根本没用到外部的id变量- 构建
docRef时用了硬编码的ID,没有替换成动态传入的id
另外,如果你需要在文档更新时自动获取最新数据,应该用Firestore的实时监听API(onSnapshot),而非单次获取的getDoc,这更贴合你“更新文档时仅获取所需ID”的需求。
修正后的代码(单次获取数据)
useEffect(() =>{ const fetchData = async (targetId) =>{ // 用传入的动态ID替换硬编码值 const docRef = doc(db, "users", targetId); const docSnap = await getDoc(docRef); if (docSnap.exists()) { const theData = docSnap.data(); console.log('getUserDoc() setting userInfo:', theData); setUserInfo(theData); console.log("Document data:", docSnap.data()); } else { console.log("No such document!"); } } // 调用时传入外部的id变量,先判断id有效性避免无效请求 if (id) { fetchData(id); } }, [id]);
实时监听文档更新(推荐方案)
如果要实现文档更新时自动同步数据,替换为onSnapshot,同时记得清理监听函数防止内存泄漏:
useEffect(() =>{ // 先判断id是否有效,避免无效监听 if (!id) return; // 创建实时监听 const unsubscribe = onSnapshot(doc(db, "users", id), (docSnap) => { if (docSnap.exists()) { const theData = docSnap.data(); console.log('实时更新userInfo:', theData); setUserInfo(theData); console.log("最新文档数据:", docSnap.data()); } else { console.log("No such document!"); } }); // 组件卸载时清理监听 return () => unsubscribe(); }, [id]);
额外注意事项
- 确保外部的
id变量是正确的文档ID,且能正确传递到useEffect的依赖数组中 - 若
id可能为空或未定义,必须加判断,避免Firestore抛出无效路径错误
内容的提问来源于stack exchange,提问作者Deezy
相关产品推荐
相关产品推荐

