Совместное использование объектов и избежание глобальных изменений в node.js - PullRequest
5 голосов
/ 14 марта 2012

Что было бы наиболее подходящим способом передачи соединения с базой данных в приведенном ниже фрагменте (переменная db) с моими маршрутизаторами / контроллерами, не превращая переменную db в глобальную?

var mongo = require('mongoskin'),
db = mongo.db(config.db.adress);

app.use(function(req, res, next) {
    db.open(function(err, data) {
        (err) ? res.send('Internal server error', 500) : next();
    });
});

// Setting up controllers here
app.post('/users', require('./controllers/users').create);

Исходя из PHP-фона, я подумал о Внедрение зависимостей , но я понятия не имею, подходит ли это для узла.

Ответы [ 4 ]

7 голосов
/ 14 марта 2012

Попробуйте посмотреть так:

app.js:

var mongo = require('mongoskin'),
db = mongo.db(config.db.adress);

app.use(function(req, res, next) {
    db.open(function(err, data) {
        (err) ? res.send('Internal server error', 500) : next();
    });
});

require('./controllers/users')(app, db);

controllers / users.js:

module.exports = function (app, db) {

    app.post('/users', function(req, res, next) {
        // Your create function
        // Link to db exists here
    });

};
5 голосов
/ 24 октября 2012

У меня нет опыта работы с mongoskin, но Mongoose аккуратно обходит эту проблему, возвращая экземпляр Mongoose синглтона каждый раз, когда вам это требуется.

, который позволяет создать соединение один раз (при запуске приложения,обычно) и просто используйте его, запрашивая Модели, когда вам это нужно.

Это также позволяет вам определять свои модели один раз так:

var mongoose = require('mongoose'),

  TodoSchema = new mongoose.Schema({
    title: { 'type': String, 'default': 'empty todo...' },
    order: { 'type': Number },
    done: { 'type': Boolean, 'default': false }
  });

mongoose.model('Todo', TodoSchema);

И затем использовать их везде, где вам нравитсяэто:

  var mongoose = require('mongoose'),
      Todo = mongoose.model('Todo');

Больше информации о том, как Mongoose работает подобным образом, пример кода можно найти в этот ответ здесь .

Из документов mongoskin это выглядит таквам нужно подключаться каждый раз, когда вы хотите его использовать, что можно упростить, поместив соединение db в файл, который вам может потребоваться:

db.js

exports.db = require('mongoskin').db('myProject-' + process.env.NODE_ENV);

используйте его:

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

db.open(function(err, data) {
        (err) ? res.send('Internal server error', 500) : next();
    });

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

2 голосов
/ 16 марта 2012

В итоге я воспользовался ответом Вадима Барышева и пошел еще дальше, создав модуль State, объединяющий часто используемые модули, чтобы сохранить порядок:

state.js:

module.exports = {
    mongo: require('mongoskin'),
    db: require('mongoskin').db('myProject-' +process.env.NODE_ENV )
} 

app.js:

var state = require('./state');
require('./controllers/Users')(app, state);

Контроллеры / users.js:

module.exports = function (app, state) {

    app.post('/users', function(req, res, next) {
        state.db.find({}, function(doc, err) {});
    });

};
0 голосов
/ 23 сентября 2014

Как предполагает @Jed Watson, модуль moongoose использует шаблон синглтона (анти?), Который обеспечивается механизмом require / export.Вот конкретный бит кода:

(как найдено здесь: https://github.com/LearnBoost/mongoose/blob/master/lib/index.js)

/*!
 * The exports object is an instance of Mongoose.
 *
 * @api public
 */

var mongoose = module.exports = exports = new Mongoose;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...