使用Express和MongoDB从多个独立的集合中获取

Jac*_*b K 2 database mongodb node.js express

我有一个网站,我需要显示我的Mongo数据中的一些数据.然而,我的问题是我需要来自两个集合的数据.完全独立且彼此无关的集合.

现在我在我的路线中有我的个人资料页面:

router.get('/profile', function(req, res,next) {
   var resultArray = [];

   mongo.connect(url, function(err, db) {
      var cursor = db.collection('users').find();
      cursor.forEach(function(doc, err) {
         resultArray.push(doc);
      }, function() {
         db.close();
         res.render('profile/index', {users: resultArray});
      });
   });
});
Run Code Online (Sandbox Code Playgroud)

当然,这非常合适.但是我如何获得第二个db.collection('colors').find();传递给我的模板呢?

我确定这是微不足道的,我只是不完全掌握事物,但是,是的......我被卡住了......

chr*_*dam 7

使用最适合此方案的异步库.如果您需要运行多个不依赖于彼此的任务,并且当它们完成其他任务时,您应该使用async.parallel()方法.签名是async.parallel(tasks, callback),其中tasks是一组函数.

它将立即并行运行所有函数,等待所有函数调用它们的任务回调,最后当所有任务完成后,它将运行回调(最终回调).

以下示例演示了如何根据您的用例调整它:

router.get('/profile', function(req, res, next) {
    mongo.connect(url, function(err, db) {
        var locals = {};
        var tasks = [
            // Load users
            function(callback) {
                db.collection('users').find({}).toArray(function(err, users) {
                    if (err) return callback(err);
                    locals.users = users;
                    callback();
                });
            },
            // Load colors
            function(callback) {
                db.collection('colors').find({}).toArray(function(err, colors) {
                    if (err) return callback(err);
                    locals.colors = colors;
                    callback();
                });
            }
        ];

        async.parallel(tasks, function(err) { //This function gets called after the two tasks have called their "task callbacks"
            if (err) return next(err); //If an error occurred, let express handle it by calling the `next` function
            // Here `locals` will be an object with `users` and `colors` keys
            // Example: `locals = {users: [...], colors: [...]}`
            db.close();
            res.render('profile/index', locals);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)