Node.js 和 MongoDB,重用 DB 对象
Posted
技术标签:
【中文标题】Node.js 和 MongoDB,重用 DB 对象【英文标题】:Node.js and MongoDB, reusing the DB object 【发布时间】:2013-06-10 12:49:28 【问题描述】:我是 Node.js 和 MongoDB 的新手,但我已经设法将 SO 和 mongo 文档中的一些部分组合在一起。
Mongo 文档给出了例子:
// Retrieve
var MongoClient = require('mongodb').MongoClient;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db)
if(!err)
console.log("We are connected");
);
如果我只需要在一个地方的一个功能中使用数据库,这看起来不错。搜索和阅读 SO 告诉我,我不应该每次都打开一个新连接,而是使用一个池并重用我第一次获得的数据库对象。这个答案在 SO 上很丰富,但我不知道如何首先获取 DB 对象,然后如何重用它。
假设我的 App.js 中有上面的 Node.js 代码,然后我有不同的路由需要在数据库上运行不同的操作,例如:
app.post('/employee', function(req, res)
//Put req.name in database
);
app.post('/car', function(req, res)
//Put req.car in database
);
我将如何将这两个 sn-ps 组合成有用的东西?
我在 Node.js reuse MongoDB reference 中发现了一个类似的问题,但从这个 (http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html) 的外观来看,我应该使用 MongoClient 而不是 db()。而且我也不确定它是否能解决我的问题......
【问题讨论】:
【参考方案1】:您总是可以编写一个模块来初始化您的数据库连接,并使它们在您的整个程序中都可以访问。例如:
mongo.js
var mongodb = require('mongodb');
module.exports.init = function (callback)
var server = new mongodb.Server("127.0.0.1", 27017, );
new mongodb.Db('test', server, w: 1).open(function (error, client)
//export the client and maybe some collections as a shortcut
module.exports.client = client;
module.exports.myCollection = new mongodb.Collection(client, 'myCollection');
callback(error);
);
;
app.js
var mongo = require('./mongo.js');
//setup express...
//initialize the db connection
mongo.init(function (error)
if (error)
throw error;
app.listen(80); //database is initialized, ready to listen for connections
);
randomFile.js
var mongo = require('./mongo.js');
module.exports.doInsert = function ()
//use the collection object exported by mongo.js
mongo.myCollection.insert(test: 'obj', safe:true, function(err, objects)
if (err)
console.warn(err.message);
);
;
我知道人们谈论池,但是当我对池 mongo 连接与所有请求的单个连接进行基准测试时,单个连接实际上表现更好。当然,这是大约一年前的事了,但我怀疑基本概念已经改变。所有请求都是异步的,因此不需要多个连接来同时发出请求。
就 MongoClient 而言,我想这是他们鼓励的新语法。无论哪种方式,它本质上都是一个 client 对象,无论您使用哪种样式,您都希望保留并使其可访问。
【讨论】:
嗯,在尝试之前必须阅读模块和内容。 “module.exports.init”对我来说看起来很奇怪:) 但是你说的是“app.js”中的代码应该只运行一次,然后“randomFile.js”中的代码就是我使用的那个在我的 app.post('/employee') 中?作为我的第一次,我将所有内容都放在一个 App.js 文件中。 没错,init
函数应该只被调用一次。 randomFile.js
只是一个示例,表明您可以在代码中的任何位置使用已初始化的数据库。我可以在 app.js 中轻松使用。如果你要使用 node,你肯定应该了解模块是如何工作的,但它们真的不难。
非常感谢您的时间和精力,我今天搞定了!当我启动服务器时,我立即获得了 5 个与数据库的连接。这很糟糕吗? (猜测 5,因为它是默认允许的连接?)我确实更改了 init 调用以及我如何使用该模块,请参阅pastebin.com/QFdZY51F
我不确定你为什么假设有五个连接。它应该只有一个
看起来mongodb驱动自动做了一些连接池。这就是为什么有 5 个连接,而 MongoClient.connect() 正在做的是创建一个连接池。【参考方案2】:
从您上一个代码 sn-p 来看,您似乎使用的是 Express 或类似的框架。您可以使用express-mongo-db 在req
对象中获取连接。该中间件将为您缓存连接并与其他传入请求共享:
app.use(require('express-mongo-db')(require('mongodb'), db: 'test' ))
app.post('/employee', function(req, res)
// req.db.collection('names'),insert(req.name)
// Put req.name in database
);
app.post('/car', function(req, res)
// req.db.collection('names').insert(req.name)
// Put req.car in database
);
【讨论】:
以上是关于Node.js 和 MongoDB,重用 DB 对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Node JS 应用程序中实现单例 mongoDB DB 对象
用Node.JS+MongoDB搭建个人博客(model目录)