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

如何对多个Firestore查询使用Promise.all,解决查询结果为undefined问题

问题根因

你的代码混淆了两个不同的ID值:
你从feedItems集合查询返回的对象中,id字段是feedItems集合单条文档自身的ID,而你要查询posts集合需要的是存在于feedItems文档字段内的post ID,所以你用错误的ID去查询posts集合时,Firestore返回的是空文档,调用data()自然返回undefined。

修复步骤

  1. 首先确认你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;
}
  1. 再修改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;
}
  1. (可选)优化useEffect的依赖项,把uid加入依赖数组,避免uid变化时不重新拉取数据:
useEffect(() => {
  // 原有逻辑
}, [uid]); // 把uid加入依赖

内容的提问来源于stack exchange,提问作者Jason A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:00:03