Node.js表达:从所需模块访问应用程序配置

时间:2018-03-16 13:56:07

标签: node.js express

我有一个大型的Node.js Express API可供构建,所以我想确保我的解决方案架构稳定且可扩展。

路由在每个单独的文件中定义并存储在/ routes文件夹中。还有一个index.js文件,其中所有子路由都注册到主路由器。

有一个应用程序配置文件/config/app.js:

module.exports = {
  development: {
    configVar: 123
  },
  test: {
    configVar: 456
  },
  production: {
    configVar: 789
  },
}

config对象加载在主应用程序index.js文件中:

const path      = require("path");
const env       = process.env.NODE_ENV || "development";
const config    = require(path.join(__dirname, 'config', 'app.js'))[env];

现在我有了配置对象,我想把它传递给任何消费者。对于Express应用程序,它主要是路线。在每个模块中重复加载配置将是多余的。所以我设置了我的主路由模块(/routes/index.js),如下所示:

const express = require('express');
const router = express.Router();
module.exports = {
  init: function(config) {
    router.use('/test', require('./test').init(config));
    return router;
  }
}

和/ test route(/routes/test.js):

const express = require('express');
const router = express.Router();

module.exports = {
  init: function(config) {
    router.post("/", function(req, res) {
      res.send('hello world');
    });
    return router;
  }
}

我也喜欢这种结构,我可以在测试路由时模拟配置对象。我的问题是,如果这可以被认为是Express应用程序的一个好模式,或者可能会有一些约定。

1 个答案:

答案 0 :(得分:1)

有许多方法可以为猫咪设置皮肤,还有很多方法可以设置快速项目。

作为改变的好事,跳出来的一件事就是你的配置方法。你的方法很有意义,但是有一个名为config的模块,其工作方式与你所说明的相同,但你不需要为每个环境列出每个选项。

使用此模块,您可以拥有一个包含所有基本配置的default.json文件。然后,您可以使用与您的环境名称匹配的文件覆盖它,例如developmenttest,而无需手动执行。

更重要的是,它还可以让您从应用程序配置映射到环境变量。您很少希望将应用程序配置值存储在代码库本身中,尤其是在我们谈论API密钥和机密时。您要做的最后一件事是将API密钥/秘密提交到版本控制中。上面链接的配置模块允许您定义环境变量映射,这意味着您可以通过系统环境变量来提供它们。

我最后应该注意,有很多模块以类似的方式配置,它们的功能略有不同。您可能还想考虑nconf这也是一个很棒的模块。