正常NodesJs 路由配置 是这样的
const app = require('express')();
app.get('/', (req, res) => {
// ...
});
项目中经常会对目录结构进行 MVC 的分层,所以很多情况下会这样组织代码:
- 定义一个 controller
exports.renderHomepage = (req, res) => {
res.render('home');
};
- 定义一个 router
const homeController = require('/path/to/controller');
app.get('/home', homeController.renderHomepage);
当然这边一般会使用 express.Router() 对 router 进行拆分,当然这并不在这次的讨论中。
这样的声明和定义方式确实没有什么问题,但是当项目在日积月累的迭代过程中,这一部分代码就会变得十分冗余。
因此需要实现一种自动路由加载的机制,而不再需要去写这些可以简化的代码。
- 目录树如下
controllers
├── home
│ └── index.js
└── list
└── index.js
- 在入口文件(如:app.js) 写入以下代码
const app = require('express')();
const glob = require('glob');
/**
* 自动遍历项目数 遍历成接口方法
*/
glob('./controllers/**/*.js', {}, (err, files) => {
files.forEach(file => {
const instance = require(file);
const urlPath = file.replace('./controllers', '').replace(/\.[^.]*$/g, '');
const methods = Object.keys(instance);
methods.forEach(method => {
app[method.toLowerCase()](urlPath, instance[method]);
});
})
})
这样路由加载和核心就写的差不多了,还是十分简洁精炼的。