2013-11-17 5 views
6

im использование expressJS и mongoDB, и я стараюсь, чтобы мое соединение mongodb было открыто в одном месте для всего приложения.Handle mongodb connection in expressJS

Как мне это сделать?

Я не хочу, чтобы открыть его каждый раз, когда в моем каждом маршруте/файл модели, который выглядит как:

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

ответ

14

У вас есть несколько разумных вариантов. Это действительно вопрос личных предпочтений.

Создайте еще один модуль, который открывает соединение и есть все остальные модули используют этот модуль:

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'), чтобы взять ее.

3

Для этого можно использовать промежуточное программное обеспечение express-mongo-db. Он будет создавать и кэшировать соединение с mongodb, чтобы вы могли использовать его внутри findAll через свойство req.db.

+0

те прохладное спасибо;) – maq

+0

Это кажется гораздо проще (и лучше по этому вопросу) решения, чем принято –

+0

@floatdrop - ты легенда, спасибо за указание на это, спасли меня так много времени :) – user992731

0

Если вы не хотите использовать экспресс-Монго-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(); 
}); 
... 

маршруты /индекс.JS

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