1

我正在尝试将 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 文件中,但我不想这样做,因为:

  1. 对我来说似乎是一种不好的做法,并且
  2. Heroku 会定期轮换凭证并更新附加此数据库的应用程序。(引自 Heroku)

在深入研究nconf 自述文件问题后,我了解到可以通过以下方式模仿这个预期的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 的 env vars 正确地重新创建一个对象?

4

1 回答 1

0

我终于找到了解决方案。

除非你想修改nconf.env(settings)如下:

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

这将使传递lowerCase: true给成为可能,env()因此如果环境变量被称为 SOMETHING 或 SOMEthing,它也将可以使用某些东西 [ Source ]

我建议使用已经小写的环境变量。

所以,

heroku config:set database__client=postgres

将是可读的:

nconf.get('database:client');

看起来nconf有一个不同的字符分隔符来定义嵌套变量调用separator和另一个读取它们调用logicalSeparator(它的默认值是:

于 2017-08-01T16:10:31.440 回答