我有一个大型的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应用程序的一个好模式,或者可能会有一些约定。
答案 0 :(得分:1)
有许多方法可以为猫咪设置皮肤,还有很多方法可以设置快速项目。
作为改变的好事,跳出来的一件事就是你的配置方法。你的方法很有意义,但是有一个名为config的模块,其工作方式与你所说明的相同,但你不需要为每个环境列出每个选项。
使用此模块,您可以拥有一个包含所有基本配置的default.json
文件。然后,您可以使用与您的环境名称匹配的文件覆盖它,例如development
或test
,而无需手动执行。
更重要的是,它还可以让您从应用程序配置映射到环境变量。您很少希望将应用程序配置值存储在代码库本身中,尤其是在我们谈论API密钥和机密时。您要做的最后一件事是将API密钥/秘密提交到版本控制中。上面链接的配置模块允许您定义环境变量映射,这意味着您可以通过系统环境变量来提供它们。
我最后应该注意,有很多模块以类似的方式配置,它们的功能略有不同。您可能还想考虑nconf这也是一个很棒的模块。