我如何构建我的快递应用程序,我只需要打开一次mongodb连接?

时间:2012-03-10 23:23:26

标签: node.js mongodb express

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

我遇到的问题非常简单,但我对这个问题很陌生,而且我在解决如何在节点/快速应用程序中正确实现mongodb数据库连接时遇到了问题。

我正在使用express 3.x并且我的应用程序布局基于express的作者提供的这个项目: https://github.com/visionmedia/express/tree/master/examples/blog

我没有兴趣创建博客,但应用程序的结构方式看起来非常好。路线是分开的,一切都井然有序。

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

所以我的问题是,每次我想查询数据库时,做一个db.open(...)似乎是一个非常可怕的想法。我现在应该提一下我使用的是本机mongo-db驱动程序(npm install mongodb)。

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

...在所有这些路径文件和我的所有模型文件中。然后我还要处理几十个打开的连接。

有没有办法可以用这样的方式构建我的应用程序,在这种情况下我只进行1次连接,并且在会话期间保持打开状态(有一个新的请求,每个请求都会变坏)?

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

感谢。

修改

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

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

在路径js文件中,它的开头如下:

module.exports = function(app){

我在今天早些时候偶然发现了一个项目,我看到有人在modules.exports调用中传递了2个变量 - >功能(app,db)。然后想到哇可能就这么简单,我还需要调整我的路线(app,db)吗?是的,似乎是这样。

所以现在问题的第1部分已经解决了。我不需要在每个路由文件中都需要带有连接样板的mongo.js文件。同时它足够灵活,我可以决定选择哪个路由文件传递db引用。这是标准的,没有任何缺点吗?

问题的第2部分(不幸的是重要的)仍然存在。

如何围绕我的每个查询绕过必须执行db.open(...),理想情况下每个会话只进行一次连接?

3 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:3)

我为这个案例制作了一个非常简单的模块hub,取代了全局空间的使用。

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

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'的功能。模块仅在第一次加载,所有其他调用都获得对已加载实例的引用。

<强>更新

这就是我的意思:

在像app.js这样的主文件中,我们创建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);
    });
};

答案 2 :(得分:1)

真的很傻。在文档中,似乎db.open需要包含在使用它的任何东西,但实际上你可以在没有回调的情况下使用它。

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

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