注意:请在回答之前阅读本文的编辑部分,这可能会节省您的时间并回答我的一个问题。
我遇到的问题很简单,但我对这个整体还是很陌生,我在弄清楚如何在 Node/express 应用程序中正确实现 mongodb 数据库连接时遇到了问题。
我使用的是 express 3.x,我的应用程序布局基于 Express 作者提供的这个项目: https://github.com/expressjs/express/tree/d8caf209e38a214cb90b11ed59fd15b717b3f9bc/examples/blog (现已从 repo 中删除)
我对创建博客没有兴趣,但是应用程序的结构方式似乎相当不错。路线是分开的,一切都井井有条。
我的问题是我可能有 5-6 个不同的路由 js 文件,每个路由 js 文件可能有 1 到 15 个路由;这些 route 的 1 或 15 条可能想要访问数据库。
所以我的问题是每次我想查询数据库时执行 db.open(...) 似乎是一个非常糟糕的主意。我应该在这一点上提到我正在使用 native mongo-db 驱动程序(npm install mongodb)。
我还需要包含这样的文件: http://pastebin.com/VzFsPyax
...在所有这些路由文件和我的所有模型文件中。然后我还要处理几十个打开的连接。
有没有一种方法可以构建我的应用程序,使我只建立 1 个连接并在 session 期间保持打开状态(每次请求都创建一个新连接也会很糟糕)?
如果是这样,我该怎么做?如果您知道答案,请使用 tj 的博客应用程序(本文前面链接的应用程序)结构发布代码示例作为基本指南。基本上有一种方法可以让路由和模型在与 db 开放代码不同的文件中自由使用 db。
谢谢。
编辑
我在解决我的一个问题上取得了一些进展。如果您查看 tj 的博客示例,他会像这样在 app.js 中初始化他的路由:
require('./routes/site')(app);
require('./routes/post')(app);
在路由 js 文件中是这样开始的:
module.exports = function(app){
我今天早些时候偶然发现了一个项目,我看到有人在 modules.exports 调用 -> 函数(app,db)中传递了 2 个变量。然后想哇会这么容易吗,我是否也需要将我的路线调整为(app,db)?是的,好像是这样。
所以现在问题的第 1 部分已经解决。我不必在每个路由文件中都需要一个带有连接样板的 mongo.js 文件。同时它足够灵活,我可以决定选择哪些路由文件通过数据库引用。这是标准的,没有缺点吧?
问题的第 2 部分(不幸的是,重要的部分)仍然存在。
如何绕过必须围绕我所做的每个查询执行 db.open(...) 并且理想情况下每个 session 只建立一次连接?
最佳答案
其他解决方案是通过请求将数据库传递给路由器,如下所示:
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;
关于node.js - 如何构建我只需要打开一次 mongodb 连接的快速应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651066/