【发布时间】:2018-08-25 14:55:44
【问题描述】:
我要构建一个大型 Node.js Express API,因此我想确保我的解决方案架构稳定且可扩展。
每个路由都在其自己的单独文件中定义并存储在 /routes 文件夹中。还有一个 index.js 文件,其中所有子路由都注册到主路由器。
有一个应用配置文件/config/app.js:
module.exports = {
development: {
configVar: 123
},
test: {
configVar: 456
},
production: {
configVar: 789
},
}
配置对象被加载到主应用程序的 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 路由(/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 应用程序的良好模式,或者可能需要遵循一些约定。
【问题讨论】:
-
这应该很好用。只有一件事可能不酷,那就是您的配置是代码的一部分,这可能不是您想要的。不过,您可以使用
rc。 -
配置是代码的一部分是什么意思?该配置文件执行 JavaScript,因此它可以包含表达式?我认为这是优势而不是劣势。当然也可以是json文件,分别加载。
-
部分代码,如检入版本控制。如果您的配置包含密码和应该安全的东西,您可能不希望在版本控制中使用它。我只是说:)