如何使用node-config在运行时覆盖配置值?

时间:2017-09-22 16:59:37

标签: node.js testing configuration lab node-config

我想在测试时覆盖一些值,特别是将http服务的重试次数设置为1(立即失败,不重试)。我们的项目使用node-config。根据{{​​3}},我可以使用NODE_CONFIG env变量覆盖:

node myapp.js --NODE_CONFIG='{"Customer":{"dbConfig":{"host":"customerdb.prod"}}}'

我宁愿在我的测试中这样做,但不是所有的测试。 docs表示您可以通过设置ALLOW_CONFIG_MUTATIONS来允许配置变种。

process.env.ALLOW_CONFIG_MUTATIONS = "true";
const importFresh = require('import-fresh');
importFresh("config");

process.env.NODE_CONFIG = JSON.stringify({httpServices:{integration:{enrich: {retryInterval: 1, retries: 1}}}});
expect(process.env.NODE_CONFIG, 'NODE_CONFIG not set').to.exist();
expect(process.env.NODE_CONFIG, 'NODE_CONFIG not set').to.match(/retryInterval/);
expect(process.env.ALLOW_CONFIG_MUTATIONS, 'ALLOW_CONFIG_MUTATIONS not set').to.equal("true");

const testConfig = require("config");
console.dir(testConfig.get("httpServices.integration.enrich"));
expect(testConfig.get("httpServices.integration.enrich.retryInterval"), 'config value not set to 1').to.equal(1);

结果:

{ url: 'https://internal-**********',
  retryInterval: 5000,
  retries: 5 }
 `Error: config value not set to 1: Expected 5000 to equal specified value: 1`

如何让此覆盖工作?

(期望来自Hapi.js代码库)

3 个答案:

答案 0 :(得分:5)

我是node-config的维护者之一。您的错误是您第二次使用require时应该再次使用importFresh

首次使用“importFresh()”与require()没有任何区别,因为它是第一次使用require()

设置一些变量后,调用require(),它将返回已生成和缓存的config副本,忽略环境变量集的影响。

您只需使用importFresh()一次,目前使用require()。这将导致返回配置对象的“新”副本,如预期的那样。

答案 1 :(得分:1)

仅更改config的属性对我有用。 例如:

const config = require( 'config' ); 

config.httpServices.integration.enrich.retryInterval = 1;

// Do your tests...

UPD:请确保在任何人调用第一个config.get()之前先进行覆盖,因为一旦任何客户端通过config使用值,get()对象就变得不可变。

答案 2 :(得分:0)

最好在配置文件夹中创建development.json,production.json et test.json.node-config将使用它的app配置。 你只需将你的NODE_ENV设置为使用特定文件。 希望它有所帮助:)