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
相关产品推荐
相关产品推荐

