Node.js异步数据库查询导致requestArray为空的问题求助
问题原因
你代码里的核心问题是**forEach不支持异步函数的等待**。当你在forEach里写async j => {...}时,这些异步函数会被触发但不会被等待,代码会直接跳过循环执行后面的result = {...result , requestArray}和返回响应,此时所有的await request.count都还没执行完,requestArray自然是空的。
修复方案
用map配合Promise.all来处理所有异步计数请求,确保所有统计完成后再组装结果返回:
static getMyJobs = async (req , res , next)=>{ const {userId}= req; try { const page = +req.params.p || 1; const limit = +req.params.l || 10; const options = paginateOptions(page, limit , { createdOn: -1 }, { path: 'user', select: 'company' }); let result = await job.paginate({user: userId}, options); // 用map生成每个job对应的计数Promise,再用Promise.all等待全部完成 const requestArray = await Promise.all( result.items.map(async j => { return await request.count({job: j._id}); }) ); result = {...result , requestArray}; return res.status(200).json(result); } catch (err) { next(err); } }
额外优化建议
如果你的数据量较大,多次调用request.count会产生大量数据库查询,建议用MongoDB的聚合查询一次性统计所有job的请求数,性能会更好:
// 在获取result之后,用聚合查询批量统计 const jobIds = result.items.map(j => j._id); const requestCounts = await request.aggregate([ { $match: { job: { $in: jobIds } } }, { $group: { _id: "$job", count: { $sum: 1 } } } ]); // 把统计结果映射成和job顺序对应的数组 const requestArray = result.items.map(j => { const countItem = requestCounts.find(item => item._id.toString() === j._id.toString()); return countItem ? countItem.count : 0; });
内容的提问来源于stack exchange,提问作者Javad-M
相关产品推荐
相关产品推荐

