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

Node.js中Mongoose循环查询结果无法存入数组的问题求助

嗨,我来帮你搞定这个问题~

首先得搞清楚为什么你打印出来的是空数组:Hobby.find({})是异步操作,它的.then()回调会在数据库请求完成后才执行,但你的console.log(arr)是同步代码,会在所有异步请求还没返回结果的时候就先跑了,这时候数组当然是空的。另外还有个小坑:你用var声明的i在循环里会有作用域问题,等.then()回调执行时,i已经变成了someModel.length,这时候arr[i]其实是给数组的一个不存在的位置赋值,根本存不到你想要的内容。

下面给你两种简单易懂的解决方案:

方案一:用Promise.all并行处理所有异步请求(推荐,效率更高)

这种方法会把所有的数据库请求都发出去,等全部完成后再统一处理结果:

// 先把每个异步操作转成Promise,放进数组里
const hobbyPromises = someModel.map(item => {
  // 哦对了,看你代码里没用到Hobby.find返回的hob,是不是写错了?
  // 如果是想根据每个item的_id查对应的 Hobby 数据,应该改成 Hobby.findById(item._id)
  return Hobby.find({})
    .then(hob => {
      // 这里如果需要用hob的内容,比如取hob的hobbyname,就改成 return hob[0].hobbyname
      return item.hobbyname;
    })
    .catch(err => {
      console.log('请求出错:', err);
      throw err; // 把错误传递下去,让Promise.all能捕获
    });
});

// 等待所有Promise都完成
Promise.all(hobbyPromises)
  .then(arr => {
    console.log(arr); // 这时候arr就是你要的结果啦!
    // 在这里做你需要的返回操作就行
  })
  .catch(err => {
    console.log('有请求失败了:', err);
  });

方案二:用async/await串行处理(更直观,适合新手理解)

这种方法会一个接一个地处理每个异步请求,代码看起来和同步代码差不多:

async function getHobbyList() {
  try {
    const arr = [];
    // 用for...of循环代替普通for循环,避免var的作用域问题
    for (const item of someModel) {
      // 同样,如果是查单个数据,改成 await Hobby.findById(item._id)
      const hob = await Hobby.find({});
      // 如果需要用hob的内容,就改成 arr.push(hob[0].hobbyname)
      arr.push(item.hobbyname);
    }
    console.log(arr);
    return arr; // 返回最终的数组
  } catch (err) {
    console.log('出错了:', err);
  }
}

// 调用这个异步函数
getHobbyList();

额外提醒

如果你本来是想根据someModel里的每个_id去查询对应的 Hobby 数据,那记得把Hobby.find({})改成Hobby.findById(item._id),不然你每次都是查所有的 Hobby 数据,有点浪费资源哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:09:22