我刚开始使用带有express和mongoose的node.js,我有一个愚蠢的问题......
在我的routes.js文件的某处,我有以下部分:
// DASHBOARD SECTION, GET MY GROUPS
app.get('/dashboard', isLoggedIn, function(req, res) {
var Group = require('../app/models/group'); //adding mongoose Schema
Group.find({"groupDetails.userId" : req.user._id})
.exec(function(err, myGroups) {
if (err)
res.send(err);
var myGroups = myGroups;
//console.log("myGroups: " + myGroups); // check with "heroku logs"
res.render('dashboard.ejs', {
user : req.user,
myGroups : myGroups
});
});
});
此代码有效。当有人浏览仪表板页面时,我会收到" myGroups"这是一个包含当前登录用户的所有组的数组。
现在,我的问题是:
实际上当有人浏览仪表板页面时,我想进行第二次查询(基于完全相同的模式)以获取当前登录用户的所有组和所有文件。
然后我会发送"用户"," myGroups"和#34; myFiles"到仪表板页面。 我怎么能这样做?
到目前为止,我尝试了几项没有结果的事情......我想我在node.js回调函数中有点丢失了:D
非常感谢你的帮助。
答案 0 :(得分:2)
这里有两个选项:
1)处理回调地狱(回调里面的回调......)来检索3组数据。这种方式最不优雅和高效
2)使用一个异步执行作业的库,并在检索完所有数据后进行一次回调,你可以使用async
库,这真是太棒了。在这种情况下,您将只有一个回调,您可以在其中访问所有已获取的数据。
以下是您在案件中使用async
可以执行的操作:
var async = require('async');
..........
app.get('/dashboard', isLoggedIn, function(req, res) {
var Group = require('../app/models/group'); //adding mongoose Schema
var User = require('../app/models/user'); //adding mongoose Schema
var Files = require('../app/models/files'); //adding mongoose Schema
async.parallel({
groups: function(callback){
Group.find(...).exec(callback);
},
users: function(callback){
Users.find(...).exec(callback);
},
files: function(callback){
Files.find(...).exec(callback);
}
}, function(err, results) {
if (err)
res.send(err);
var groups = results.groups;
var users = results.users;
var files = results.files;
res.render('dashboard.ejs', {
user : req.user,
myGroups : groups,
users: users,
files: files
});
});
});