博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
express的路由配置优化
阅读量:7183 次
发布时间:2019-06-29

本文共 2667 字,大约阅读时间需要 8 分钟。

默认情况下,express的路由写起来还挺麻烦的。比如下面这样:

app.get('/blacklists/', get_all);

app.get('/blacklists/:id', get_all);
app.post('/blacklists/:id', update);
app.post('/blacklists', create);
app.detete('/blacklists/:id' : del);

这样写是什么大的问题,至少它能正常运行。但有二个小问题:

1、不便于以后的扩展和维护,如果需要监听的URL越来越多,它看上去就会越来越糟糕了;

2、不够灵活,如果还需要对“hello”、“aa”…进行监听,所有的代码处理都被放在一个地方了,只会越来越臃肿;

 

有没有比较好的方案对路由的处理管理和配置呢?

我们可以使用“惯例优先原则”来定义好一个约定:我期望的是所有的路由相关的处理,都放在项目文件路径下,一个名为“routes”的文件夹里,里面可以可以再建立N层文件夹,而每一个js文件,仅处理以该文件名为路径的请求,如上面的“blacklists”相关的处理全部放在blacklists.js文件内。如何实现呢?

 

1、获取当前项目routes目录内所有的文件(包含子文件夹);

2、加载每一个文件,获取指定属性下的配置,如果存在,就动态拼接成如文章开头的配置,如:app[method](path, func);

 

部分实现代码:

//假设文件存放在routes目录,取名为hello.js exports.autoroute = {
'get' : {
'/hello(/?)' : hello, '/hello/:id' : hello2 }, 'post' : {
} } function hello(req, res) {
res.end('hello'); } function hello2(req, res) {
res.end('hello ' + req.params.id); } ------------------------------------------------------------------------ //当前项目的routes目录的路径 var routesDir = path.dirname(require.main.filename) + "/routes"; fs.readdir(routesDir, function(err, files) {
if (err) {
return ; } files.forEach(function(path) {
//routes目录下的文件路径 var filePath = routesDir + "/" + path; fs.stat(filePath, function(err, stats) {
if (err) {
return ; } if (stats.isDirectory()) {
//递归执行函数 } else {
//加载文件并解析 loadFile(filePath); } }) }); }) function loadFile(filePath) {
var routeObj = require(filePath); //如果包含autoroute属性,则进行解析 if (routeObj.autoroute) {
/* * autoroute就是上面hello.js的内容: 'get' : {
'/hello(/?)' : hello, '/hello/:id' : hello2 }, 'post' : {
} */ for (var method in routeObj.autoroute) {
var routeList = routeObj.autoroute[method]; if (!routeList) {
break ; } //method就是上面取到的get、post for(var routeRule in routeList) {
//func获取得到的就是上面对应各项的处理函数 var func = routeList[path]; app[method](routeRule, func); } } } }

运行后的效果如下:

如果routes有同名的两个js文件,分属于不同的文件夹,那会是怎么样的结果呢?假设dd目录下也有相同的一个js文件hello.js

exports.autoroute = {
'get' : {
'/hello(/?)' : hello, '/hello/:id' : hello2 }, 'post' : {
} } function hello(req, res) {
res.end('dd hello'); } function hello2(req, res) {
res.end('dd hello ' + req.params.id); }

运行后的效果:

而控制台上也会显示当前监听的url

 

如此一来,我们的开发就会很方便了。

 

本文的代码和思路参考了,在express中使用也比较简单^_^

 

安装:

npm install express-autoroute

 

使用:

var autorouter = require('express-autoroute');

autorouter(app); //其中app = express();

 

有兴趣的可以读读它的源码,这篇文章本来就是参数它来的:)

转载地址:http://fwykm.baihongyu.com/

你可能感兴趣的文章
垂直居中的几种方法
查看>>
我的友情链接
查看>>
PTN960
查看>>
$_FILES[‘file’][‘error’] 错误代码和相关的错误常量
查看>>
将项目加入maven管理时报错
查看>>
Qt线程
查看>>
数据库小知识
查看>>
ASP.NET WEB API必知必会:特性路由
查看>>
'Worker' object has no attribute '_config'
查看>>
微信支付开发H5调用支付接口失败
查看>>
IIS安装及IIS无权访问解决方法(Failed to access IIS metabase解决)
查看>>
Oracle下ORA-28002错误处理
查看>>
新方法让纳米材料组装合成“指哪长哪”
查看>>
springboot及微服务
查看>>
【unity】手势操作之初识FingerGestures
查看>>
nginx配置url重定向-反向代理
查看>>
MySQl的备份和恢复(笔记2)
查看>>
打算做一个网站
查看>>
18大解读
查看>>
编写自己的内核模块
查看>>