请问如何简化 Nodejs routes 规则?
请问如何简化 Nodejs routes 规则?
目前是这样子写的:
app.get('/admin/index', admin.index);
app.get('/admin/login', admin.login);
app.get('/admin/logout', admin.logout);
app.get('/admin/news_list', admin.news_list);
app.get('/admin/users', admin.users);
看起来很傻的感觉,请问各位是如何写 routes 的? 怎么简化一下这个?
要简化 Node.js 中的路由规则,可以利用路由参数和动态路径来减少重复代码。以下是一些方法,可以帮助你简化路由配置:
方法1: 使用中间件函数
你可以将一些常见的逻辑封装到中间件函数中,然后在路由定义时使用这些中间件。
const express = require('express');
const app = express();
const adminController = require('./controllers/admin');
// 定义一个通用中间件
function adminRoute(path, action) {
app.get(`/admin/${path}`, (req, res) => {
adminController[action](req, res);
});
}
// 使用中间件定义路由
adminRoute('index', 'index');
adminRoute('login', 'login');
adminRoute('logout', 'logout');
adminRoute('news_list', 'news_list');
adminRoute('users', 'users');
方法2: 使用数组或对象来管理路由
你可以创建一个包含所有路由的数组或对象,并遍历它们以设置路由。
const express = require('express');
const app = express();
const adminController = require('./controllers/admin');
// 路由定义
const routes = [
{ path: 'index', action: 'index' },
{ path: 'login', action: 'login' },
{ path: 'logout', action: 'logout' },
{ path: 'news_list', action: 'news_list' },
{ path: 'users', action: 'users' }
];
// 设置路由
routes.forEach(route => {
app.get(`/admin/${route.path}`, (req, res) => {
adminController[route.action](req, res);
});
});
方法3: 使用 Express Router
Express 提供了内置的 Router
类,可以用来创建模块化的、可挂载的路由句柄。这有助于组织和复用路由。
const express = require('express');
const app = express();
const router = express.Router();
const adminController = require('./controllers/admin');
router.get('/index', adminController.index);
router.get('/login', adminController.login);
router.get('/logout', adminController.logout);
router.get('/news_list', adminController.news_list);
router.get('/users', adminController.users);
app.use('/admin', router);
以上方法都可以帮助你简化路由定义,使代码更简洁和易于维护。选择最适合你项目需求的方法即可。
大部分框架都是这样的,你可以用数组
admin["login"]=function(){}
function get(url){
var name = url.split('/')[1];
admin[name]();
}
但这样可读性不好,维护也不方便。
####你可以这样
var pages = [
{route: '', output: 'Woohoo!'},
{route: 'about', output: 'A simple routing with Node example'},
{route: 'another page', output: function() {return 'Here\'s '+this.
route;}},
];
####或者
module.exports = function(app){
app.get('/',function(req,res){
res.render('index',{
//something to here
});
});
});
楼主这样写挺好的,非常方便查找。 有些简化可以从 url 设计上入手,例如设计成 restful格式的
* GET /users => list()
* GET /users/:id => show(req.params.id)
* POST /users => create()
* PATCH /users/:id => update(req.params.id)
* DELETE /users/:id => delete(req.params.id)
这样可以用一些路由库来简化 https://github.com/node-modules/restful-router
写一个router函数,然后就能通过文件定义了:
- https://github.com/XadillaX/xplan-backend/blob/master/router/index.js
- https://github.com/XadillaX/xplan-backend/blob/master/router/main-rule/user.js
大概就是上面一个是路由的helper,下面那个就是路由规则的写法了。
你可以写一套规则,根据目录结构实现自动route,缺点的不够灵活,优点是省事。
这样写挺好的,团队开发的话你会发现让后来的人很容易看懂代码,找到代码。
你现在的写法应该是官方的,自动就生成了这种格式的,这样写维护性可读性确实高点。
这样写便于维护和别人看你的代码,代码简洁了别人也就不容意看懂了。
你可以通过使用一个中间件函数或者一个路由参数来简化这些路由规则。这里提供一种常见的方法,使用路由前缀来处理。
示例代码
const express = require('express');
const app = express();
// 创建一个用于处理/admin/路径下的路由的router
const adminRouter = express.Router();
// 设置路由前缀
adminRouter.get('/index', (req, res) => {
// 处理 admin.index 的逻辑
res.send('Admin Index Page');
});
adminRouter.get('/login', (req, res) => {
// 处理 admin.login 的逻辑
res.send('Admin Login Page');
});
adminRouter.get('/logout', (req, res) => {
// 处理 admin.logout 的逻辑
res.send('Admin Logout Page');
});
adminRouter.get('/news_list', (req, res) => {
// 处理 admin.news_list 的逻辑
res.send('Admin News List Page');
});
adminRouter.get('/users', (req, res) => {
// 处理 admin.users 的逻辑
res.send('Admin Users Page');
});
// 将 router 挂载到应用上,并设置路由前缀
app.use('/admin', adminRouter);
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 使用
express.Router()
创建一个专门处理/admin
路径下所有路由的路由器。 - 在创建的路由器上定义所有的路由,这样可以避免重复的路径前缀。
- 最后,将这个路由器挂载到主应用上,并设置路由前缀为
/admin
。
这种方法不仅使代码更整洁,还便于管理和维护。如果你有更多的路由需要添加,只需要在 adminRouter
上继续添加即可。