我怎样才能构build我的快速应用程序,我只需要打开一个mongodb连接?

注意:请在回答之前阅读本文的编辑部分,这可能会节省您的时间并回答我的一个问题。

我遇到的问题是非常简单的,但我是相当新的整体,我有问题搞清楚如何在节点/快速应用程序中正确实施MongoDB数据库连接。

我正在使用Express 3.x,并将我的应用程序布局作为快速作者提供的此项目的基础: https : //github.com/visionmedia/express/tree/master/examples/blog

我对创build博客没有兴趣,但是应用程序的结构看起来相当不错。 路线是分开的,一切都很好地组织。

我的问题是我可能有5-6个不同的路由js文件,每个路由js文件可能有1到15个路由之间的任何地方; 这些路由1或15可能要访问数据库。

所以我的问题是这似乎是一个非常可怕的想法做一个db.open(…)每一次我想查询数据库。 在这一点上我应该提到我正在使用本地mongo-db驱动程序(npm install mongodb)。

我还需要包含这样的文件: http : //pastebin.com/VzFsPyax

…在所有这些路线文件和我所有的模型文件。 然后,我也打了几十个打开的连接数十打交道。

有没有办法以这种方式构build我的应用程序,我只能build立一个连接,并在会话期间保持打开状态(如果有新的请求,每个请求都会变得不好)?

如果是这样,我该怎么做? 如果您知道答案,请使用tj的博客应用程序(本文前面链接的应用程序)结构作为基础指南发布代码示例。 基本上有一种方式,路线和模型可以使用数据库,而在分开的文件,而不是数据库开放代码。

谢谢。

编辑

我在解决我的一个问题上取得了一些进展。 如果你看看tj的博客例子,他就像这样在app.js中初始化他的路线:

require('./routes/site')(app); require('./routes/post')(app); 

而在路线js文件中,它是这样开始的:

 module.exports = function(app){ 

我今天早些时候偶然发现一个项目,我看到有人在modules.exports调用 – >函数(app,db)中传递了两个variables。 然后想出哇,这是否容易,我是否需要调整我的路线(app,db)呢? 是的,似乎是这样。

所以现在问题的第一部分已经解决了。 我不必在每个路由文件中都要求连接样板文件的mongo.js文件。 同时,它足够灵活,我可以决定select哪个path文件传递数据库引用。 这是标准的,没有不好的权利?

问题的第二部分(不幸的是重要的一部分)依然存在。

我怎么能绕过每一个查询做一个db.open(…),最好每个会话只做一次连接?

其他解决scheme是通过请求将数据库传递给路由器,如下所示:

app.js

 var db = openDatabase(); var app = express(); app.all('*', function(request, response, next) { request.database = db; next(); }); app.get('/api/user/:id', Users.getByID); 

users.js

 var Users = { getByID: function(request, response) { request.database.collection('users').findOne(...) response.send(user); } }; module.exports = Users; 

我为这种情况做了一个非常简单的模块中心 ,取代了全局空间的使用。

在app.js中,您可以创build一次数据库连接:

 var hub = require('hub'); hub.db = new Db('foobar', new Server('10.0.2.15', 27017, {}), {native_parser: false}); 

并从任何其他文件使用它:

 var hub = require('hub'); // hub.db - here link to db connection 

这个方法使用了一个'require'的特性。 模块只是第一次加载,所有其他的调用获取已加载实例的引用。

UPDATE

那就是我的意思:

在像app.js这样的主文件中,我们创build了Db连接,打开它并存储到集线器中:

app.js:

 var hub = require('hub'); hub.mongodb = require('mongodb'); hub.mongodbClient = new hub.mongodb.Db('foobar', new hub.mongodb.Server('10.0.2.15', 27017, {}), {native_parser: false}); hub.mongodbClient.open(function(error) { console.log('opened'); }); 

现在在任何其他文件(例如消息)中,我们可以访问打开的连接,并可以简单地使用它:

message.js:

 var hub = require('hub'); var collection = new hub.mongodb.Collection(hub.mongodbClient, 'message'); module.exports.count = function(cb) { collection.count({}, function(err, count) { cb(err, count); }); }; 

真的很傻。 在文档中,似乎db.open需要将任何使用它的东西都包裹起来,但实际上,您可以在不使用callback的情况下使用它。

所以答案就是在你的数据库连接模块,app.js文件或者你决定设置你的数据库服务器/连接的地方做一个db.open()。

只要您在使用它的文件中传递对数据库的引用,就可以访问准备好查询的“已打开”数据库连接。