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

如何将Mongoose集合返回值存入JavaScript数组及存储MongoDB集合数据

解决MongoDB异步查询的变量赋值与响应问题

嘿,我来帮你搞定这个问题!首先得明确一个核心点:MongoDB的find().toArray()是异步操作——它的回调函数要等数据库查询完成后才会执行,所以你不能直接在回调外同步赋值然后使用变量,因为回调执行时,外面的代码早就跑完了。

下面给你两种实用的实现方式:

方式一:在回调内处理数据并响应客户端

直接在toArray的回调里拿到查询结果docs,完成赋值后直接给前端返回数据,同时别忘了处理错误:

router.get('/dashboard', function(req, res) {
  // 移除硬编码的测试数据,直接从数据库查询
  Booking.collection.find().toArray(function(err, docs) {
    if (err) {
      // 捕获并处理数据库查询错误
      console.error('查询Booking集合出错:', err);
      return res.status(500).json({ error: '数据库查询失败' });
    }
    console.log(docs);
    console.log("S-------------------------------------------------");
    // 这里直接把查询结果赋值给变量
    const booking = docs;
    // 如果是渲染页面模板(比如EJS/Pug),用这个:
    // res.render('dashboard', { bookings: booking });
    // 如果是API接口返回JSON,用这个:
    res.json({ bookings: booking });
  });
});

方式二:用async/await简化异步代码(更推荐)

ES6的async/await能让异步代码看起来像同步代码,可读性更强,也能避免回调嵌套:

router.get('/dashboard', async function(req, res) {
  try {
    // 用await等待查询完成,直接拿到结果
    const booking = await Booking.collection.find().toArray();
    console.log(booking);
    console.log("S-------------------------------------------------");
    // 根据业务需求选择渲染模板或返回JSON
    // res.render('dashboard', { bookings: booking });
    res.json({ bookings: booking });
  } catch (err) {
    console.error('查询Booking集合出错:', err);
    res.status(500).json({ error: '数据库查询失败' });
  }
});

额外小提示

如果你用的是Mongoose(从代码里的Booking模型来看大概率是),其实更推荐用Mongoose原生的查询语法,写法更简洁:

// 用lean()可以把Mongoose文档转成普通JS对象数组,和toArray()效果一致
const booking = await Booking.find().lean().exec();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:55:23