node.js / express / mongoose noob问题

时间:2014-12-30 09:40:14

标签: node.js mongodb express mongoose

我刚开始使用带有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

非常感谢你的帮助。

1 个答案:

答案 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
        });
    });
});