Node.js模块从MongoDB数据库中获取数据

我想使用一个模块来获取和处理来自我的MongoDB数据库的数据。 (它应该生成一个代表我的Express.js网站的导航栏的对象)

我想到做这样的事情:

var nav = { Home: "/" }; module.exports = function() { MongoClient.connect(process.env.MONGO_URL, function(err, db) { assert.equal(err, null); fetchData(db, function(articles, categories) { combine(articles, categories, function(sitemap) { // I got the data. What now? console.log("NAV: ", nav); }) }); }); }; var fetchData = function(db, callback) { db.collection('articles').find({}).toArray(function(err, result) { assert.equal(err); articles = result; db.collection('categories').find({}).toArray(function(err, result) { assert.equal(err); categories = result; db.close(); callback(articles, categories); }); }); }; var combine = function(articles, categories, callback) { categories.forEach(function(category) { nav[category.title] = {}; articles.forEach(function(article) { if(article.category == category.name) { nav[category.title][article.title] = "link"; } }) }); callback(nav); }; 

至于第6行,我确实有我需要的所有数据。

(一个对象,像{ Home: '/', Uncategorized: { 'Hello world!': 'link' } }

但是因为我是匿名函数,所以我不知道如何返回这个值。 我的意思是, return将返回它调用它的函数…最后,MongoClient.connect将收到我的数据。

如果我设置一个variables,它会被设置为module.exports返回之前,节点甚至可以查询数据库中的数据,对吧?

我能做些什么来完成这项工作?

它应该导致某种function,比如

 var nav = require('nav'); console.log(nav()); 

提前致谢!

添加另一个callback:

 var nav = { Home: "/" }; module.exports = function(cb) { MongoClient.connect(process.env.MONGO_URL, function(err, db) { assert.equal(err, null); fetchData(db, function(articles, categories) { combine(articles, categories, function(sitemap) { cb(sitemap); }) }); }) }); 

然后用这种方式:

 var nav = require('nav'); nav(function(sitemap){ console.log(sitemap); }); 

你可以使用mongoose模块或和尚模块。 这些模块已经过正确testing。

只是使用

npm安装mongoose或和尚

关于mongoose的build议是伟大的,你可以看看它,但是我认为你已经完成了从数据库中获取数据的工作。 您只需要在主节点stream中访问它。

你可以试试这个:

 module.exports.generateNav = function() { MongoClient.connect(process.env.MONGO_URL, function(err, db) { assert.equal(err, null); var output = fetchData(db, function(articles, categories) { combine(articles, categories, function(sitemap) { }) }); return (output); }); }; 

然后在你的主应用程序中,可以通过以下方式调用它:

 var nav = require('nav'); navigation = nav.generateNav(); console.log(navigation);