Присоединение объекта к процессу 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');
честно говоря, мне нравится это решение. Теперь я могу получить данные конфигурации в любом месте, без необходимости модуля. Но в этом могут быть и недостатки... и это может быть очень плохой идеей. ИДК.
2 ответа
Это не замедлит выполнение, но чувствует себя "вонючим". Это трудно обнаружить, и это будет трудно проверить, если вы когда-нибудь решите, что вам нужно.
Лучшим решением было бы присоединить настройки к модулю и использовать require() для импорта его, где это необходимо.
Лучшее решение - просто передать объект настроек классам или модулям, которые в этом нуждаются. Либо напрямую, либо как часть какого-то "глобального контекста".
Например.
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();
}
Обратите внимание, что nconf является синглтоном.
Я использую для настройки в самом начале программы, а затем, когда мне нужно настройки в другом файле, я делаю:
var nconf = require ('nconf');
nconf.get('x');