处理expressJS中的mongodb连接

即时通讯使用expressJS和mongoDB,我试图坚持我的MongoDB连接在一个地方打开整个应用程序。

我应该怎么做?

我不想每次都在我的每个path/模型文件中打开它,如下所示:

moods.js(示例文件,我有很多,每个集合一个)

exports.findAll = function(req, res) { db.collection('moods', function(err, collection) { collection.find().toArray(function(err, items) { res.send(items); }); }); }; .... some other methods 

和主要的app.js文件:

 var express = require('express'); var routes = require('./routes'); var mood = require('./routes/moods'); var http = require('http'); var path = require('path'); var app = express(); // all environments app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'hjs'); app.use(express.favicon()); ... app.get('/moods', mood.findAll); .... http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); 

现在,我应该在哪里放置这段代码,并为我的每个收集文件工作? 我的意思是打开一个连接,而不是每次我想要查询我的数据库时都会打开新的连接。

  var mongodb = require('mongodb'); var db = new mongodb.Db('xxxx', new mongodb.Server('xxxx', 10059, {}) ); db.open(function (err, db_p) { if (err) { throw err; } db.authenticate('xxxx', 'xxxx', function (err, replies) { // You are now connected and authenticated. }); }); 

你有几个合理的select。 这实际上是个人喜好的问题。

创build另一个打开连接的模块,并让所有其他模块使用该模块:

 mongo_connection.js 

在那个文件中,你将把连接和authentication码。 导出db实例,例如:

 exports.db = db; 

在其他文件中,您可能require

 var connection = require('./mongo_connection.js'); var db = connection.db; 

或者,我经常创build连接(在一个模块中),然后将其传递给路由中的初始化函数:

 var users = require('./routes/users.js'); users.initialize(db); 

我经常这样做,因为还有其他常见的configuration工作和我想提供给路由的设置:

 var initialize = function(app, config) { }; 

如果你通过快速app实例,你也可以set它:

 app.set('mongo', db); 

然后使用app.get('mongo')来获取它。

你可以使用express-mongo-db中间件。 它会创build和caching连接到MongoDB,所以你可以通过req.db属性在findAll中使用它。

如果你不想使用express-mongo-db,你可以用下面的方法做同样的事情:

app.js / server.js

 ... let _db = null; MongoClient.connect('mongodb://localhost/test', (err, db) => { _db = db; }); app.use(function(req, res, next) { res.locals.db = _db; next(); }); ... 

路线/ index.js

 ... router.get('/', function(req, res) { res.locals.db.authenticate('xxxx', 'xxxx', function (err, replies) { // You are now connected and authenticated. }); }); ...