Как прочитать вложенный файл 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 и вопросы, которые я понял, что можно было бы подражать этому ожидаемому database объект только с:

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

и определяя переменные как:

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 объект будет так здорово, чтобы заставить его работать правильно.

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

1 ответ

Решение

Я наконец нашел решение.

Если вы не хотите изменить nconf.env(settings) лайк:

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

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

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

Так,

heroku config:set database__client=postgres

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

nconf.get('database:client');

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

Другие вопросы по тегам