2014-10-04 83 views
0

我有一個應用程序,需要從Mongo數據庫中的兩個不同集合中讀取數據,並將返回的對象傳遞到句柄模板中。將多個對象傳遞給句柄模板 - MongoDB,node.js,mongoskin

隨着代碼我下面我無法弄清楚如何讓它的工作,因爲universityData和courseData變量沒有得到填充,不知道這是否是正確的方式來做到這一點。

在回調中的大學和課程對象正常工作,因爲當我登錄時,我得到了我需要的值。

router.get('/newcastle/G400', function(req, res) { 
var db = req.db; 
var universityData; 
var courseData; 

db.collection('universities', function(err, collection) { 
    collection.findOne({'code': 'N21'}, function(err, university) { 
     universityData = university; 
     console.log(university); 
     //res.render('course', {title: university.name, university: university, course: { "code": "G400", "name": "Computer Science", "studylength": "3 years (BSc)/4 years (MSc)", "requirements": "AAB - ABB", "satisfactionrating": "98"}}); 
    }); 
}); 
db.collection('courses', function(err, collection) { 
    collection.findOne({'universitycode': 'N21', 'code': 'G400'}, function(err, course) { 
     courseData = course; 
     console.log(course); 
    }); 
}); 
console.log(universityData); 
console.log(courseData); 
res.render('course', {university: universityData, course: courseData}); 
}); 

我的問題是我怎樣才能從每個查詢的對象傳遞到一個模板?

任何幫助將不勝感激,因爲我是相當新的Javascript,節點和Mongo。

回答

1

儘管它只是「兩個」功能,但您可以使用像async這樣的模塊來幫助組織它們而不會深度嵌套。例如:

var async = require('async'); 

// ... 

router.get('/newcastle/G400', function(req, res) { 
    var db = req.db; 

    async.parallel([ 
    universityData: function(callback) { 
     db.collection('universities', function(err, collection) { 
     if (err) 
      return callback(err); 
     collection.findOne({'code': 'N21'}, callback); 
     }); 
    }, 
    courseData: function(callback) { 
     db.collection('courses', function(err, collection) { 
     if (err) 
      return callback(err); 
     collection.findOne({'universitycode': 'N21', 'code': 'G400'}, callback); 
     }); 
    } 
    ], function(err, results) { 
    if (err) 
     return res.send(500); 
    // results === { universityData: { ... }, courseData: { ... } } 
    res.render('course', results); 
    }); 
}); 
+0

非常感謝您的答案,如果偉大的作品!我改變了一件事就是我的'res.render'方法現在是'res.render('course',{university:results [0],course:results [1]})'。這是一種可接受的方式來分割結果對象,使其更容易在我的模板中? – adamtrousdale 2014-10-04 14:45:01

+0

如果你想要不同的鍵名稱,你可以將函數重命名爲'university:function(callback){}',並且'courseData'是相同的,然後'results'將是'{university:...,course :. ''。然後用'res.render('course',results);''你的模板中會有'university'和'course'作爲變量。 – mscdex 2014-10-04 15:24:00