提问者:小点点

node.js-为每个目录导出index.js中的所有文件是一种好的做法吗?


// 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')所示。 你的首选解决方案是什么? 我应该导出所有文件吗? 这是一个好的做法吗?


共1个答案

匿名用户

您可以创建一个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;
        // ...
    }
}