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);