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

Node.js中MongoDB查询结果导出至Jade模板的Promise问题解决

问题:获取MongoDB查询结果并传递至Jade视图时仅得到Promise对象

我尝试通过以下代码导出MongoDB集合的查询结果:

exports.getAllQuestions = async function (){
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("Time4Trivia");
        return dbo.collection("Questions").find({}).toArray().then();
      });
};

随后在路由中引用该返回结果,尝试渲染到Jade文件:

router.get('/play', function(req, res, next) {
   var questionsArray = mongoDAL.getAllQuestions()
  console.log("This is the questions array: " +  questionsArray)
  
  res.render('play', { title: 'Time 4 Trivia',user: req.session.user, questions: questionsArray});
});

但控制台仅输出:

This is the questions array: [object Promise]

如何将真实数组传递至Jade文件?


解决方案

1. 修复数据层的异步逻辑

原getAllQuestions函数虽标记了async,但内部使用回调式的MongoClient.connect,导致函数无法正确返回查询结果的Promise。改成基于async/await的标准写法:

exports.getAllQuestions = async function (){
  // 用await替代回调建立数据库连接
  const client = await MongoClient.connect(url);
  const dbo = client.db("Time4Trivia");
  // 等待查询结果解析完成
  const questions = await dbo.collection("Questions").find({}).toArray();
  // 关闭连接避免资源泄漏
  client.close();
  return questions;
};

2. 在路由中等待Promise解析

getAllQuestions返回的是Promise对象,必须通过await(或.then())获取实际数组。同时要将路由函数标记为async,并添加错误处理:

router.get('/play', async function(req, res, next) {
  try {
    // await等待Promise完成,得到真实数组
    const questionsArray = await mongoDAL.getAllQuestions();
    console.log("This is the questions array: ", questionsArray);
    res.render('play', { 
      title: 'Time 4 Trivia',
      user: req.session.user, 
      questions: questionsArray
    });
  } catch (err) {
    // 将错误传递给Express错误处理中间件
    next(err);
  }
});

核心原因说明

  • 标记async的函数默认返回Promise,直接调用只会得到Promise对象,必须通过await或.then()提取内部值。
  • 原代码中MongoClient.connect回调里的return无法传递到外层async函数,导致函数返回空Promise,这是问题根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:15:57