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

getServerSideProps如何等待所有fetch完成后再执行return语句

问题原因

你当前代码提前返回空数组,本质是Array.prototype.forEach不会阻塞内部异步请求:forEach本身是同步执行的,遍历过程中触发的Firebase文档拉取请求都是异步任务,不会等请求返回就会直接走到return逻辑,此时帖子数组还没被填充,自然拿到空值。

修复方案

把原来的forEach遍历逻辑替换为Promise.all + map的组合,等待所有帖子拉取请求全部完成后,再组装数组返回,参考代码如下:

// 原有获取用户数据的逻辑保留
const userSnapshot = await fetchUserByUsername(username); // 你之前单次请求拿用户对象的逻辑
const userData = userSnapshot.data();
const postIdList = userData.uploads ?? [];

// 替换原forEach遍历的核心逻辑
const postList = await Promise.all(
  postIdList.map(async (postId) => {
    const postDoc = await db.collection('posts').doc(postId).get();
    return {
      postId: postDoc.id,
      ...postDoc.data()
    }
  })
);

// 所有请求完成后再返回,此时postList是完整的帖子数组
return postList;
可选优化

如果存在帖子ID对应文档已被删除的场景,可以加一层过滤,避免返回无效数据:

const postList = (await Promise.all(
  postIdList.map(async (postId) => {
    const postDoc = await db.collection('posts').doc(postId).get();
    return postDoc.exists ? { postId: postDoc.id, ...postDoc.data() } : null
  })
)).filter(item => item !== null);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:39:18