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

