express的路由配置优化-阿里云开发者社区

开发者社区> meteoric> 正文

express的路由配置优化

简介: 默认情况下,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); 这样写是什么大的问题,至少它能正常运行。
+关注继续查看

默认情况下,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-autoroute,在express中使用也比较简单^_^

 

安装:

npm install express-autoroute

 

使用:

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

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

 

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
DNSMasq 域名解析配置
DNSMasq DNSMasq 主要用来解决内网 DNS 域名缓存、DHCP、网络启动和路由通告功能,本文主要是将 DNSMasq 作为内网 DNS 使用。
2512 0
Presto性能优化
Presto性能优化http://www.bieryun.com/3467.html 查询速度慢, 如何优化? 解决方法1: 避免单节点处理 虽然Presto是分布式查询引擎, 但是一些操作是必须在单节点中处理的.
3207 0
生产服务器环境最小化安装后Centos 6.5优化配置备忘
生产服务器环境最小化安装后 Centos 6.5优化配置备忘 本文 centos 6.5 优化 的项有18处,列表如下: 1、centos6.
1284 0
MySQL SSD 参数优化
SSD硬盘:慢查询日志可以设置0.5秒,如果超过0.5秒。0.5秒在SSD上最少走了50个IO,就有可能没有用到索引。0.5秒还是有点问题:如果从8000W中找一条记录,如果加上order 等计算耗时,比较小。
3398 0
express的路由配置优化
默认情况下,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); 这样写是什么大的问题,至少它能正常运行。
631 0
+关注
423
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载