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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:30:08