Promise.all未等待map函数resolve导致Express获取用户动态接口异常
问题原因与修复方案
你的代码核心问题出在Promise.all返回值的结构和查询方式的潜在问题,按以下步骤排查修复即可:
- 嵌套数组结构错误
Post.find()查询返回的是单用户的帖子数组,经过map调用后传给Promise.all的是多个查询Promise,最终resolve得到的friendPosts是二维数组(结构为[[用户1的所有帖子], [用户2的所有帖子], ...]),直接和一维的userPosts拼接会得到嵌套结构,不符合预期。
修复方法:拼接时展开二维数组,或者改用更高效的批量查询// 方法1:展开后拼接 res.status(200).json(userPosts.concat(...friendPosts)) // 方法2:直接批量查询(更推荐,性能更高避免并发问题) // 替换原Promise.all那段代码即可,返回的直接是一维好友帖子数组 const friendPosts = await Post.find({ userId: { $in: currentUser.followings } }) - 错误定位方法
如果修改后还是有问题,可以在catch块中添加错误打印,查看具体的报错信息:
常见的额外问题包括:catch (err) { console.error('接口报错详情:', err) res.status(500).json(err); }currentUser.followings中存在不符合MongoDB ObjectId格式的无效值、数据库连接数不足导致并发查询超时,根据打印的错误信息针对性处理即可。
内容的提问来源于stack exchange,提问作者Shawndale Shogbamimu
相关产品推荐
相关产品推荐

