如何在nconf中阅读Heroku的嵌套process.env vars / object?

时间:2017-08-01 09:53:32

标签: heroku environment-variables heroku-postgres nconf

我试图将Ghost 1.2.0部署到Heroku。使用以前版本的Ghost(< = 0.11.x),他们使用了foreach ($_POST as $key => $value) { // do some stuff } 文件,您可以这样做:

config.js

但是在这个版本中,他们使用nconf替换此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 }, … 来替换config.js等依赖于环境的JSON文件。

与JS对象不同的JSON文件不能将vars作为值。我可以将我的凭据硬编码到JSON文件,但我不想这样做,因为:

  1. 对我来说看起来不好,
  2. Heroku定期轮换凭据并更新附加此数据库的应用程序。(引自Heroku)
  3. 在深入了解config.production.json READMEissues之后,我明白可以模仿这个预期的nconf对象:

    database

    将vars定义为:

    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...
    

    它有效。我可以尝试(并且我会)修改Ghost脚本以这种方式读取所有变量,但只要它需要一个nconf.get('DATABASE__CLIENT'); // postgres 对象就可以让它以正确的方式工作。

    那么,是否有人想出如何使用Heroku的env vars正确地重新创建一个对象?

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。

除非你想修改nconf.env(settings)之类的:

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

这样就可以将lowerCase: true传递给env(),这样如果环境变量被称为SOMETHING或SOME,那么它也可以使用[Source]

我建议使用已经小写的env vars。

所以,

heroku config:set database__client=postgres

将使用以下内容阅读:

nconf.get('database:client');

看起来nconf有一个不同的字符分隔符来定义名为separator的嵌套变量,另一个用于读取它们称为logicalSeparator(其默认值为: