Node.js 如何执行多个查询并将所有数据发送到模板,以便在单个res.render中进行渲染?
我有一个名为CriterPedia的MongoDB数据库,包含3个集合:鱼、虫子、海洋生物。我试图查询这些集合,以呈现将于本月离开的生物。下面是我的鱼收集查询,它可以工作并呈现。如何对其他两个集合执行相同的查询,但通过单个res.render()调用一次发送所有数据 理想情况下,我希望:Node.js 如何执行多个查询并将所有数据发送到模板,以便在单个res.render中进行渲染?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有一个名为CriterPedia的MongoDB数据库,包含3个集合:鱼、虫子、海洋生物。我试图查询这些集合,以呈现将于本月离开的生物。下面是我的鱼收集查询,它可以工作并呈现。如何对其他两个集合执行相同的查询,但通过单个res.render()调用一次发送所有数据 理想情况下,我希望: //Query fish collection //Query Bugs collection //Query Sea collection //res.render('index', {fish : fish
//Query fish collection
//Query Bugs collection
//Query Sea collection
//res.render('index', {fish : fish, bugs : bugs, sea : sea});
提前谢谢你 嗯,很简单,你甚至都不会相信 与使用
$merge
和$lookups
编写庞大的模型。聚合
查询不同,您可以创建3个。一次(并行)、通过或
你也可以在之前做出一系列承诺,比如:
let futureFinds = [];
if (need to search for fish) {
futureFinds.push(await fish_db.find(query))
}
if (need to search for bugs) {
futureFinds.push(await bugs_db.find(query))
}
const [result_one, result_two] = await Promise.all(futureFinds)
然后立即处理它们,正如您在上面的代码中所看到的。我已经为您的问题添加了一个答案,请添加您的反应,它是否会帮助您。如果它提供了有用的信息或接受它作为答案,请向上投票。谢谢你的回复,并用打字机把这篇文章写下来!我仍然在学习,并且正在做这个项目作为一个学习环境。老实说,很多事情我都想不通,但我正试图打破它。res.status(200).json(response)调用发送的数据吗?我正在使用一个EJS模板进行渲染,并试图找出我将使用什么来分解JSON对象以渲染到浏览器
等。响应
是您想通过{fish:fish,bugs:bugs,sea:sea}
看到的对象您可以通过控制台.log(response)
在res.status(200)
之前添加此字符串,并监视服务器控制台。@MattMiller,如果要res.send
EJS模板,可以在res
事件完成之前预先添加。(如果没有添加),但是tbh,最好将前端页面和后端逻辑分开。并为它制作一个API。实际上,我使用了一个API来获取数据。为了进一步了解Mongo/mongoose,我编写了一个脚本,从API中提取数据并将其放入数据库中。这就是我一直在处理的问题,现在我意识到这样做可能是一个错误。@MattMiller根据Express文档()您应该传递文件和对象,例如:res.render('user',{name:'Tobi',function(err,html){…}
const express = require('express');
const router = express.Router();
/**
* Model importing / Collections
*/
const fish_db = require("../../db/fish_db");
const bug_db = require("../../db/bug_db");
const sea_db = require("../../db/sea_db");
router.get('/critters', async function(req, res) {
try {
let response = {};
/**
* You could form / pre-determine more queries, for each of your collection
*/
let query = {$and: [{fishMonthsNorth: thisMonth}, {fishMonthsNorth: {$ne: nextMonth}}]};
/**
* Promise.allSettled is ES2020 feature, you could use Promise.all instead
* or for await of arrayOfPromises
*/
await Promise.allSettled([
fish_db.find(query).then(docs => { Object.assign(response, {fish: docs}) } )
bug_db.find(query).then(docs => { Object.assign(response, {bug: docs}) } )
sea_db.find(query).then(docs => { Object.assign(response, {sea: docs}) } )
])
/** You could add almost anything to response if you want it to */
await res.status(200).json(response);
} catch (e) {
await res.status(404).json(e);
}
});
module.exports = router;
let futureFinds = [];
if (need to search for fish) {
futureFinds.push(await fish_db.find(query))
}
if (need to search for bugs) {
futureFinds.push(await bugs_db.find(query))
}
const [result_one, result_two] = await Promise.all(futureFinds)