// configs/index.js
module.exports = {
AppConfig: require('./app-config'),
AuthConfig: require('./auth-config'),
DbConfig: require('./database-config'),
};
// controllers/some-controller.js
const { AppConfig } = require('../configs');
// tests/some-test.spec.js
// it fails because the controller require() the root index.js and it runs all exported files implicitly.
const SomeController = require('../controllers/some-controller');
上面的示例在开发中工作得很好,但是在使用mocha
进行单元测试时失败了,因为它隐式地运行所有导出的文件。 我的解决方法是直接导入文件,如require('../configs/app-config')
所示。 你的首选解决方案是什么? 我应该导出所有文件吗? 这是一个好的做法吗?
您可以创建一个configservice
类来封装对配置文件的访问,而不是导出/导入每个“子配置”。 类似于:
const lodash = require('lodash');
export class ConfigService {
static configuration = ConfigService.initConfig();
static get(key) {
return _.get(ConfigService.configuration, key);
}
// you can remove this if you don't want to support adding/changing configs at runtime
static add(key, val) {
if (ConfigService.configuration[key]) {
throw new Error(`Could not add a new configuration key <${key}>. This key exists already!`);
}
_.set(ConfigService.configuration, key, val);
}
static initConfig() {
ConfigService.configuration = {
AppConfig: require('./app-config'),
AuthConfig: require('./auth-config'),
DbConfig: require('./database-config'),
}
}
}
使用非常简单,它甚至允许您在单元测试中模拟配置值(通过删除get
-method):
class DbController {
constructor() {
this.dbHost = ConfigService.get('DbConfig').dbHost;
// ...
}
}