2015-01-25 5 views
2

Каков наилучший способ обработки конфигурации для разных сред в приложении Express?Каков предпочтительный способ хранения переменных среды/конфигурации в Express?

Должен ли я размещать {разработку, производство, тестирование} .json в /.config и загружать соответствующий файл на основе process.env.NODE_ENV? Что-то вроде ...

var env = process.env.NODE_ENV || 'development'; 
var config = require('./config/' + env + ".json"); 

или есть лучший способ?

+0

Есть ли причина, по которой вы не можете просто использовать переменные среды? – Darkhogg

+0

Извинения, я был не очень ясен. Я использую переменные среды, но конкретно, как легко загружать различные значения на основе среды, например. порт 8080 в разработке, но 3000 в производстве. Надеюсь, это немного яснее ... – drlaj

+1

Я имел в виду использование env vars для этих значений, поскольку 12 факторов предлагают: http://12factor.net/config – Darkhogg

ответ

6

Я обычно сделал что-то вроде этого:

структуры файла:

config/ 
    config.js 
    env/ 
    development.js 
    test.js 
    production.js 

А потом внутри config.js файла магазин универсальных конфигураций вещей, а также загрузки соответствующей среды конфигурации:

// main config.js file 

process.env.NODE_ENV = process.env.NODE_ENV || 'development'; 

// load the config file for the current environment 
var config = require('./env/' + process.env.NODE_ENV); 

// extend config with universal config data 
config.someEnvAgnosticSetting = true; 

// export config 
module.exports = config; 

Это позволяет легко отделять конфигурацию, специфичную для окружающей среды, при этом для любого модуля, требующего конфигурации, требуется только требование ire корневой файл конфигурации.

Например, в вашем server.js файле:

// require config, not worrying about what environment is being loaded 
var config = require('./config/config'); 

// use config data 
app.listen(config.port); 

Edit: Кстати, я не делал этого подхода вверх - это очень общий для узлов приложений (или веб-приложений в целом, но это просто так бывает, что в узле вам нужно перевернуть свою собственную настройку). Посмотрите на mean.js example app для более глубокого примера, используя этот шаблон.

+0

Спасибо @tydotg - Я пошел со средним планом приложения, следуя вашей рекомендации. – drlaj

0

Я предлагаю вам также ознакомиться с пакетом env-dot-prop.

Это позволяет вам установить/получить свойства от process.env с помощью dot-path.

Давайте предположим, что ваш process.env содержит следующее:

process.env = { 
    FOO_BAR: 'baz' 
    'FOO_': '42' 
} 

Затем вы можете манипулировать переменные окружения так:

const envDotProp = require('env-dot-prop'); 

console.log(process.env); 
//=> {FOO_BAR: 'baz', 'FOO_': '42'} 

envDotProp.get('foo'); 
//=> {bar: 'baz', '': '42'} 

envDotProp.get('foo.'); 
//=> '42' 

envDotProp.get('foo.', {parse: true}); 
//=> 42 

envDotProp.set('baz.foo', 'bar'); 
envDotProp.get('', {parse: true}); 
//=> {foo: {bar: 'baz', '': 42}, baz: {foo: 'bar'}} 

console.log(process.env); 
//=> {FOO_BAR: 'baz', 'FOO_': '42', BAZ_FOO: 'bar'} 

envDotProp.delete('foo'); 
envDotProp.get(''); 
//=> {baz: {foo: 'bar'}} 

console.log(process.env); 
//=> {BAZ_FOO: 'bar'} 

Это поможет вам проанализировать переменные среды и использовать их в качестве config в приложении.
Он также поможет вам реализовать 12-factor configuration.

+0

Я думаю, что ответ будет лучше понят без эмоций, они очень отвлекают –

Смежные вопросы