ExpressJS и передача переменных между отдельными файлами маршрутов

Я использую ExpressJs с Node.js и поместил все мои маршруты в папку "маршруты".

На сервере я подключаюсь к БД, а затем определяю свои маршруты, например:

var routes = require('./routes');

var db;
dbconnect = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {});
dbconnect.open(function (err, db) {

  db.authenticate(config.mongo_user, config.mongo_pass, function (err, success) {
    if (success) {

      //routes/index.js
      app.get('/', routes.index);

      //routes/users.js
      app.get('/users', routes.users);

    }
  });
});

Я хочу получить доступ к объекту 'db' внутри каждого из этих файлов javascript. Как передать это из этого файла app.js в index.js или users.js?

Спасибо!

Ответ 1

Одно из предложений состоит в том, чтобы разоблачить ваши маршруты с помощью функции, которая принимает параметр db:

routes.js:

module.exports = function(db) {
    return {
        index: function(req, res, next) {
            // Funky db get stuff
        }
    }
}

Обертывание значений в закрытии, подобных этому, и возвращение объекта с большим количеством функций - это полезный шаблон, иногда называемый "Отображение шаблона модуля". Он ясно показывает зависимости, что позволяет легко тестировать (используя, например, объект mock db), все еще используя гибкий функциональный подход.

Ответ 2

Если вы напишете абстракцию своей базы данных в своем собственном файле/модуле, вы можете повторно использовать ее на всей вашей кодовой базе по мере необходимости, просто требуя(), используя ее там, где это необходимо. Он не будет воссоздан, если вы его правильно напишете, и его можно просто инициализировать при запуске приложения, как это делает ваш пример.

//contents of your database.js file
var database;

module.exports = {

    init : function(config, cb) {
        database = new mongo.Db(config.mongo_database, new mongo.Server(config.mongo_host, config.mongo_port, {}), {});
        database.open(function (err, db) {  
            db.authenticate(config.mongo_user, config.mongo_pass, cb);
        });
    },

    query : function(params, cb) {
        database.query(params, cb);
    }   

};

Это тривиальный пример, но, надеюсь, он имеет смысл. В контроллерах или любых файлах, где вам нужен этот объект базы данных, вы просто...

var db = require('database');

db.init(params, function(err, db) {
    ...
});


db.query(params, function(err, db) {
    ...
});

Преимущества теперь у вас есть свободно связанный объект базы данных, который можно использовать в любом месте вашего приложения, как и любой другой модуль node через инструкцию require.