我使用MongoJS以下列方式从mongo db获取数据:app.js:
var db = mongojs('db', ['events']);
然后:
app.get('/', function(req, res){
db.events.find(function(err,docs){
res.render('index', {
title: 'Events',
events: docs
});
})
});
这个方法有效,然后我用ejs作为视图引擎以下面的方式获取它:index.ejs:
<% events.forEach(function(event){ %>
<a><%= event.event_name %></a></br>
<a><%= event.event_description %></a>
<% }) %>
但是,这一切都有效,我如何从同一个ejs页面中的不同集合中获取数据?我一直在尝试以下方式:app.js:编辑成
var db = mongojs('db', ['events', 'groups']);
然后:
app.get('/', function(req, res){
db.events.find(function(err,docs){
res.render('index', {
title: 'Events',
events: docs
});
})
});
app.get('/', function(req, res){
db.groups.find(function(err,docs){
res.render('index', {
title: 'Groups',
groups: docs
});
})
});
随后是EJS:
<% groups.forEach(function(group){ %>
<p><a><%= group.group_name %></a></br>
<a><%= group.editor %></a></p>
<a><%= group.members %></a></p>
<% }) %>
我得到的错误是'groups'没有被定义,但是如果我像这个app.js那样翻转它们:
app.get('/', function(req, res){
db.groups.find(function(err,docs){
res.render('index', {
title: 'Groups',
groups: docs
});
})
});
app.get('/', function(req, res){
db.events.find(function(err,docs){
res.render('index', {
title: 'Events',
events: docs
});
})
});
然后它说事件没有定义。如何将它们一起声明为一个而没有一个覆盖另一个?如果你能提供帮助,非常感谢你。
第一个处理程序执行后,第二个处理程序不执行,因此最简单的方法是将查询链接为:
let events;
app.get('/', function(req, res) {
db.events.find(function(err, docs) {
events = docs;
db.groups.find(function(err, docs) {
res.render('index', {
title: 'Items',
groups: docs,
events: events
});
})
});
})
上面的代码可以通过使用promises或async / await来改进。我建议你搜索异步函数,以便在Javascript中更好地编程
你只能有一个根app.get('/'...
电话。尝试组合您的路线,如下所示:
app.get('/', function(req, res) {
db.groups.find(function(groupsErr, groupDocs){
// now get events
db.events.find(function(eventsErr, eventDocs){
res.render('index', {
title: 'Events',
events: eventDocs,
groups: groupDocs
});
});
});
});
你也可以使用promises
以更漂亮的方式(更少嵌套)处理这个问题。
app.get('/', function(req, res) {
let groupsPromise = new Promise((res, rej) => {
db.groups.find((err, docs) => {
if (!err) res(docs);
else rej(err);
});
});
let eventsPromise = new Promise((res, rej) => {
db.events.find((err, docs) => {
if (!err) res(docs);
else rej(err);
});
});
Promise.all([groupsPromise, eventsPromise])
.then(docArr => {
let groupDocs = docArr[0];
let eventDocs = docArr[1];
res.render('index', {
title: 'Events',
groups: groupDocs,
events: eventDocs
});
})
.catch(console.error);
});