Как прочитать вложенные переменные / объект process.env Heroku в nconf?

Я пытаюсь развернуть Ghost 1.2.0 на Heroku. В предыдущих версиях Ghost (‹= 0.11.x) они использовали config.js файл, в котором вы могли просто:

database: {  
    client: 'postgres',
    connection: {
        host: process.env.POSTGRES_HOST,
        user: process.env.POSTGRES_USER,
        password: process.env.POSTGRES_PASSWORD,
        database: process.env.POSTGRES_DATABASE,
        port: process.env.POSTGRES_PORT
    },
    debug: false
}, …

Но в этой версии они используют nconf, который заменяет этот config.js для файлов JSON, зависящих от среды, таких как config.production.json .

Файлы JSON, в отличие от объектов JS, не могут иметь переменных в качестве значений. Я мог бы жестко записать свои учетные данные в файл JSON, но я не хочу этого делать, потому что:

  1. Мне кажется, это плохая практика, и
  2. Heroku периодически меняет учетные данные и обновляет приложения, к которым прикреплена эта база данных. (Цитируется из Heroku)

Покопавшись в nconf README и issues Я понял, что можно было бы имитировать этот ожидаемый database объект только с помощью:

nconf.env({                                                                                                            
    separator: '__' // Two dashes
});

и определение vars как:

heroku config:set DATABASE__CLIENT=postgres
heroku config:set DATABASE__CONNECTION__HOST=<value>
...

но, несмотря ни на что, я получаю undefined, когда позже позвоню:

nconf.get('database');
nconf.get('DATABASE'); // In case it was case-sensitive...

Вместо этого, если я позвоню:

nconf.get('DATABASE__CLIENT'); // postgres

оно работает. Я мог бы попытаться (и я буду) модифицировать скрипты Ghost для чтения всех переменных таким образом, но пока он ожидает объект database, будет так здорово заставить его работать правильно.

Итак, кто-нибудь придумал, как правильно воссоздать объект с помощью env vars Heroku?


person Jordi Nebot    schedule 01.08.2017    source источник


Ответы (1)


Наконец-то я нашел решение.

Если вы не хотите изменять nconf.env(settings), например:

nconf.env({                                                                                                            
    separator: '__', // Two dashes
    lowerCase: true
});

Это позволит передать lowerCase: true в env(), так что если переменная среды называется SOMETHING или SOMEthing, она также будет доступна для получения с помощью чего-то [Источник]

Я рекомендую использовать уже строчные env vars.

So,

heroku config:set database__client=postgres

будет читаться с помощью:

nconf.get('database:client');

Похоже, что nconf имеет другой разделитель символов для определения вложенных переменных с именем separator и еще один для их чтения с именем logicalSeparator (его значение по умолчанию :)

person Jordi Nebot    schedule 01.08.2017