2015-09-10 2 views
0

Я хотел бы попытаться построить более крупное, более модульное приложение node.js, чем мои предыдущие попытки. Я застрял на шаблонах дизайна, поскольку кажется, что существует слишком много способов сделать одно и то же, и я теряюсь в блоге FUD о том, как это сделать. Я работал главным образом в рамках MVC, где передается глобальная переменная приложения, и мне интересно, полезна ли эта концепция в узле. Например:Node.js design pattern

./index.js

var app = {}; 
var api = require('api'); // Api server module 
var db = require('db'); // db client 

var dbh = db.connect(); // connect to db 
app['dbh'] = dbh; 

api.start(app); 

./api.js

var API = exports; 

API.start = function(app, callback) { 
    // do api server stuff 
    app['dbh'].execute(... function (err, results){ 
    console.log('foo'); 
    }); 
} 

Является ли эта идея присвоения всех функций, данные конфигураций и переменных приложения объекта разумный подход?

+0

Узел имеет модули в качестве фундаментальной части, как это работает так, как правило, вы бы просто положить набор методов в одном модуле, а затем использовать в качестве контейнера для естественного объекта для них. Я не уверен, какую проблему вы пытаетесь решить, создав дополнительные контейнеры вне самих модулей. Вы также можете создавать модули, которые ничего не делают, кроме загрузки других модулей и объединения их интерфейсов в более крупный интерфейс модуля. Если вы ищете что-то сверх того, что предлагает модуль, я бы предложил вам описать ваши потребности, которые не обслуживаются модулями. – jfriend00

+0

IMO, интерфейсы модулей должны быть сконструированы таким образом, чтобы их можно было напрямую потреблять в качестве их интерфейса модуля, поэтому вам обычно не нужно переупаковывать их в новый интерфейс в каком-либо другом объекте. – jfriend00

+0

@ jfriend00 Я только пытаюсь сделать код, потребляющий модули более простым. Разница между передачей всех переменных модуля в функцию против передачи одной переменной приложения. Это позволит мне устанавливать и удалять функции в приложении по своему усмотрению и изменять код только в функциях, использующих переменную приложения, вместо рефакторинга самой функции. –

ответ

0

Я думаю, вам нужно знать, как передавать некоторые объекты между модулями узлов. Ниже то, что я делаю в этом случае:

Вашего главного модуль, который содержит app объекта, который мы будем проходить вокруг:

// index.js 
// this module immediately invokes itself and requires our other modules 
module.exports = (function() { 
    'use strict'; 

    // this is the main object I want to use in other modules 
    var app = { 
     version: '1.0.0' 
    }; 

    // just requiring and invoking module2 with the app argument 
    require('./module2')(app); 

    // now, I'll set a reference to module3 bec. 
    // I'll also need module3 in module4 below 
    var module3 = require('./module3')(app); 

    // and here I invoke module4 with 2 arguments this time. 
    require('./module4')(app, module3); 
    // so on... 

    return app; 

}()); 

Теперь в ваших вторичных модулях, вы можете использовать переданный объект (s):

// module2.js and/or module3.js 
// notice that the module is invoked with the app object. 
module.exports = function (app) { 
    'use strict'; 
    console.log(app.version); 
    return { 
     message: 'Hi there!' 
    }; 
}; 

// module4.js 
// notice that this module is invoked with 2 arguments this time. 
module.exports = function (app, module3) { 
    'use strict'; 
    console.log(app.version); // '1.0.0' 
    console.log(module3.message); // Hi there! 
}; 

Надежда это дает вам идею.

+0

Это действительно так, я понятия не имел, что вы можете передавать аргументы требуемым модулям. Хороший шаблон для определения всех необходимых модулей, которые потребуются всему приложению в файле index.js, например, вы сделали, и использовать этот экземпляр, только передав его другим модулям? –

+0

Вам не нужно требовать от всех модулей, которые необходимы приложениям. Это можно сделать, если модуль зависит от другого. Если модуль условно нуждается в другом модуле, я просто передам его с помощью метода.Полное приложение потребует от вас принятия множества других проектных решений на этом пути; который невозможно охватить здесь в сообщении. –

+0

@MichaelAndrews - одно практическое использование модулей в node.js и, как правило, хороший шаблон дизайна - это написать код таким образом, чтобы вы могли повторно использовать свои модули в других проектах, не меняя их. Это означает, что вы должны создавать каждый модуль как автономный объект, который делает что-то полезное сам по себе. В других модулях можно «требовать()», чтобы он выполнял свою работу (что вызывающий абонент не должен знать, какие модули он использует внутри). – jfriend00

0

Вы можете сделать небольшую корректировку для его работы:

// api.js 
module.exports.start = function(app, callback) { 
    // do api server stuff 
    app['dbh'].execute(... function (err, results){ 
    console.log('foo'); 
    }); 
}