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
相关产品推荐
相关产品推荐

