Присоединение объекта к процессу Node.js

Я использую переменную среды и модуль анализа аргументов под названием nconf для моего веб-сервера node.js Express.

https://github.com/indexzero/nconf

Я решил, что лучший способ сделать данные nconf глобальными — просто прикрепить их к переменной процесса (как в process.env). Это хорошая идея или плохая? Замедлит ли это выполнение, отягощая «процесс»?

Вот мой код:

var nconf = require('nconf');

nconf.argv()
    .env()
    .file({ file: './config/config.json' });

nconf.defaults({
    'http': {
        'port': 3000
    }
});

process.nconf = nconf;

//now I can retrieve config settings anywhere like so process.nconf.get('key');

честно говоря, мне нравится это решение. Теперь я могу получить данные конфигурации в любом месте, не требуя модуля. Но у этого могут быть недостатки... и вполне возможно, что это очень плохая идея. Я НЕ ЗНАЮ.


person Alexander Mills    schedule 19.04.2015    source источник
comment
Пожалуйста, покажите свой собственный код для использования этой библиотеки, чтобы мы могли увидеть контекст, в котором вы ее используете. Вопросы с вашим собственным кодом почти всегда дают лучшие ответы, чем теоретические вопросы, которые не показывают реальный код.   -  person jfriend00    schedule 19.04.2015
comment
добавлю немного информации   -  person Alexander Mills    schedule 19.04.2015


Ответы (2)


Это не замедлит выполнение, но будет "вонючим". Его трудно обнаружить, и его будет трудно протестировать, если вы когда-нибудь решите, что вам это нужно.

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

Лучшим решением было бы просто передать объект настроек тем классам или модулям, которые в нем нуждаются. Либо напрямую, либо как часть некоего "глобального контекста".

Eg.

var global = {
  settings: {
    port: 8080
  }
}

//...

global.api = new Api(global);

//...

function Api(global) {
  var port = global.settings.port;
}

ОБНОВЛЕНИЕ: больше информации о том, почему исходный шаблон плохой:

1) Возможность обнаружения

Вы прикрепляете свои настройки к process.settings и уходите в другой проект. Через год кто-то другой вступает во владение или вам нужно что-то обновить. Вы помните, что прикрепили свои настройки к process.nconf? Или это было process.settings?

Теперь представьте, что у вас есть 10 разных глобальных вещей, прикрепленных под разными именами в разных местах.

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

2) Тестирование

Вы решаете, что вам нужно протестировать свой модуль. Итак, теперь вам нужно настроить параметры для каждого теста, а не загружать их из файла или argv. Как ты это делаешь?

В случае глобальных шаблонов process.nconf или require("settings") вам нужно сделать что-то вроде этого:

function canOpenAPIOnTheConfiguredPort(done) {
    var nconfSaveApiPort = process.nconf.api.port;
    process.nconf.api.port = '1234';
    var api = new Api();
    test.assertEqual(api.port, '1234');
    process.nconf.api.port = nconfSaveApiPort;
    done();
}

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

function canOpenAPIOnTheConfiguredPort(done) {
    var api = new Api({
        port: '1234'
    });
    test.assertEqual(api.port, '1234');
    done();
}
person panta82    schedule 19.04.2015
comment
Я добавил некоторую информацию, пожалуйста, дайте мне знать, если она все еще пахнет чувственно - person Alexander Mills; 20.04.2015
comment
Решает проблему № 1 (обнаруживаемость). Не помогает с проблемой № 2 (тестирование). Так что лучше, но не отлично. ИМО. - person panta82; 20.04.2015
comment
что понимается под открываемостью? - person Alexander Mills; 22.04.2015

Обратите внимание, что nconf является одноэлементным.

Я использую для настройки в самом начале программы, а затем, когда мне нужна настройка в другом файле, я делаю:

var nconf = require ('nconf');
nconf.get('x');
person José F. Romaniello    schedule 20.04.2015