在expressJS中处理mongodb连接

时间:2013-11-17 15:54:25

标签: node.js mongodb express

即时通讯使用expressJS和mongoDB,我尝试将我在一个地方打开的mongodb连接保持到整个应用程序。

我该怎么做?

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

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.
           });
         });

4 个答案:

答案 0 :(得分:15)

你有几个合理的选择。这真的是个人喜好的问题。

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

mongo_connection.js

在该文件中,您将放置连接和身份验证代码。导出db实例,例如:

exports.db = db;

在其他文件中,您可以require

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

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

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

我经常这样做,因为我想为路线提供其他常见的配置工作和设置:

var initialize = function(app, config) {

};

如果你通过快递app实例,你也可以set

app.set('mongo', db);

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

答案 1 :(得分:3)

您可以使用express-mongo-db中间件。它将创建并缓存与mongodb的连接,以便您可以通过req.db属性在findAll中使用它。

答案 2 :(得分:1)

如果你不想使用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.
    });
});
...

答案 3 :(得分:0)

  

使用express-mongo-db程序包在请求中获取数据库连接

在您的App.js中

var expressMongoDb = require('express-mongo-db');
app.use(expressMongoDb('your_mongoDB_url'));

在您其他文件中的(routes etc)中需要数据库使用的地方

router.get('/test', function(req, res){
    req.db.collection("collectionName").find().toArray(function(err, docs){
        console.log(docs);
    });

});