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

Node.js中如何在循环内同步调用MongoDB查询?

解决方案

你的核心问题是forEach循环的回调函数不支持异步等待,导致await无法生效。下面给你两种可行的修改方案:

方案一:用for...of串行执行查询

把同步的forEach换成支持await的for...of循环,这样就能按顺序逐个执行数据库查询,确保每个查询完成后再进行下一个:

exports.getResponse = async (req,res)=>{
  // 遍历res.docs,支持await等待异步操作
  for (const doc of res.docs) {
      let response1 = {};
      const secondRes = await myModel.paginate({name:doc.name});
      console.log("SecondRes :: "+JSON.stringify(secondRes));
      // 在这里执行记录更新操作
  }
  // 记得添加响应返回,比如res.send('处理完成')
}

方案二:用Promise.all并行执行查询

如果不需要严格按顺序处理,这种方式可以同时发起所有数据库查询,效率更高,适合数据量不大、数据库能承受并发的场景:

exports.getResponse = async (req,res)=>{
  // 将每个查询包装成Promise
  const queryPromises = res.docs.map(async (doc) => {
      let response1 = {};
      const secondRes = await myModel.paginate({name:doc.name});
      console.log("SecondRes :: "+JSON.stringify(secondRes));
      // 处理当前记录的更新,返回结果以便后续统一处理
      return { originalDoc: doc, secondData: secondRes };
  });

  // 等待所有查询完成
  const allResults = await Promise.all(queryPromises);
  
  // 这里可以对allResults里的所有结果做批量处理或返回
  // res.send(allResults);
}

为什么forEach不行?

forEach的回调函数是同步执行的,哪怕你给回调加了async,forEach也不会等待每个回调里的异步操作完成,只会一口气把所有回调都触发,导致await完全失效,数据库返回的Promise还没resolve就继续执行下一个循环了。

另外注意你原代码里的forEach少了闭合的),记得补上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:52:46