我正在尝试将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。
与JS对象不同的是,JSON文件不能将vars作为值。我可以将我的凭据硬编码到JSON文件中,但我不想这样做,因为:
在深入研究了nconf 自述文件和问题之后,我了解到可以通过以下方式来模仿这个预期的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对象,那么让它以正确的方式工作是很酷的。
那么,有没有人知道如何用Heroku的env正确地重新创建一个对象?
发布于 2017-08-01 16:10:31
我终于找到解决办法了。
除非您想修改nconf.env(settings),例如:
nconf.env({
separator: '__', // Two dashes
lowerCase: true
});这将使将
lowerCase: true传递给env()成为可能,这样如果环境变量被称为某样东西或SOMEthing,那么它也可以使用某些东西[来源]获得。
我建议使用已经用小写的env。
所以,
heroku config:set database__client=postgres将使用以下方法读取:
nconf.get('database:client');看起来nconf有一个不同的字符分隔符来定义名为separator的嵌套变量,另一个用来读取它们的字符分隔符称为logicalSeparator (默认值是:)。
https://stackoverflow.com/questions/45434620
复制相似问题