如何在 nconf 中读取 Heroku 的嵌套 process.env 变量/对象?
How to read Heroku's nested process.env vars / object in 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 and issues 之后,我了解到可以通过以下方式模仿这个预期的 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
对象,让它以正确的方式工作就太酷了。
那么,有没有人知道如何使用 Heroku 的环境变量正确地重新创建对象?
我终于找到了解决方案。
除非你想修改 nconf.env(settings)
如:
nconf.env({
separator: '__', // Two dashes
lowerCase: true
});
This will make it possible to pass lowerCase: true
to env()
so that if an environment variable is called SOMETHING or SOMEthing, it will also be gettable using something [Source]
我建议使用已经小写的环境变量。
所以,
heroku config:set database__client=postgres
将可读使用:
nconf.get('database:client');
看起来 nconf
有一个不同的字符分隔符来定义嵌套变量 separator
和另一个用来读取它们的字符分隔符 logicalSeparator
(它的默认值是 :
)
我正在尝试将 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 and issues 之后,我了解到可以通过以下方式模仿这个预期的 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
对象,让它以正确的方式工作就太酷了。
那么,有没有人知道如何使用 Heroku 的环境变量正确地重新创建对象?
我终于找到了解决方案。
除非你想修改 nconf.env(settings)
如:
nconf.env({
separator: '__', // Two dashes
lowerCase: true
});
This will make it possible to pass
lowerCase: true
toenv()
so that if an environment variable is called SOMETHING or SOMEthing, it will also be gettable using something [Source]
我建议使用已经小写的环境变量。
所以,
heroku config:set database__client=postgres
将可读使用:
nconf.get('database:client');
看起来 nconf
有一个不同的字符分隔符来定义嵌套变量 separator
和另一个用来读取它们的字符分隔符 logicalSeparator
(它的默认值是 :
)