Как прочитать вложенный файл 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, но я не хочу этого делать, потому что:
- Похоже, плохая практика для меня, и
- 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
(его значение по умолчанию :
)