如何对多个Firestore查询使用Promise.all,解决查询结果为undefined问题
问题根因
你的代码混淆了两个不同的ID值:
你从feedItems集合查询返回的对象中,id字段是feedItems集合单条文档自身的ID,而你要查询posts集合需要的是存在于feedItems文档字段内的post ID,所以你用错误的ID去查询posts集合时,Firestore返回的是空文档,调用data()自然返回undefined。
修复步骤
- 首先确认你
feedItems集合的文档中,存储post ID的字段名,假设该字段名为postId,你可以先修改getFeedItems的返回结构避免ID混淆:
async function getFeedItems(uid) { const docRef = firestore .collection("feeds") .doc(uid) .collection("feedItems"); const doc = await docRef.get(); const feedItems = []; doc.forEach((item) => { const itemData = item.data(); feedItems.push({ ...itemData, feedItemId: item.id, // 将feedItem自身的ID重命名,避免和post ID混淆 postId: itemData.postId // 显式声明post的ID }); }); return feedItems; }
- 再修改
getPosts中的查询逻辑,使用正确的post ID发起查询:
async function getPosts(items) { const promises = items.map((item) => firestore.collection("posts").doc(item.postId).get() ); const posts = []; const results = await Promise.all(promises); results.forEach((result) => { // 新增文档存在性判断,避免异常 if (result.exists) { posts.push({ ...result.data(), id: result.id }); } }); return posts; }
- (可选)优化useEffect的依赖项,把uid加入依赖数组,避免uid变化时不重新拉取数据:
useEffect(() => { // 原有逻辑 }, [uid]); // 把uid加入依赖
内容的提问来源于stack exchange,提问作者Jason A
相关产品推荐
相关产品推荐

