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

Ant*_*lad 16 mongodb node.js 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的博客应用程序(本文前面链接的那个)结构作为基本指南发布代码示例.基本上有一种方法,路由和模型可以自由地使用数据库,而不是数据库开放代码.

谢谢.

编辑

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

require('./routes/site')(app);
require('./routes/post')(app);
Run Code Online (Sandbox Code Playgroud)

在路径js文件中,它像这样开始:

module.exports = function(app){
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Fab*_*taz 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);
Run Code Online (Sandbox Code Playgroud)

users.js

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

module.exports = Users;
Run Code Online (Sandbox Code Playgroud)


Ant*_*lad 1

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

因此,答案是在数据库连接模块、app.js 文件或您决定设置数据库服务器/连接的任何位置执行 db.open() 。

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