开始
rrestjs是我无意中确是有意接触到的一款类似却又不似express的nodejs开发框架。
为什么这么说呢?
因为我在使用express的时候,特别不爽,主要是路由这块,一堆一堆的配置,而且这个配置还是不可控的,怎么说呢。比如:app.get('/get/:id’, function(){});假如用户访问的地址是:/get/test也将会跑到这块来处理。虽然在express 3.0版本增加了一 >个next方式,让这块处理可以转移到别的路由去处理,但是感觉还是不是很爽。然后开始琢磨是不是有更好的基于nodejs的框架呢。google了一下,然后就发现了rrestjs。
之后就是看里面的例子,发现很不错,试用了一下也非常棒。里面的想法和实现,深深的震撼了我,因为那就是我要找的,而我找到了。
然后毫不留情的说服身边的人,把之前基于express构建的变成基于rrestjs构建的。
事情的开始就是这样子的了。
rrestjs路由
然后,很有必要说说rrestjs的路由。
rrestjs的路由在包裹在try{…}catch(e){}里的一段代码。非常短小,如下:
try{
require('./controller/'+req.path[0])[req.path[1]](req, res);
}
catch(err){
restlog.info(req.path.join('/')+'; '+err);
res.r404();
}
rrestjs在接收http请求时,对url进行了一次分解。比如:http://yansong.me/u/upload => req.path = ['u’, ‘upload’]; 然后去require(‘./controller/u’)之后再去调用里面的upload方法。对应的u.js就应该是这样子的:
// u.js
exports.upload = function(req, res) {
// your code here
};
而如果不存在./controller/u.js或者不存在upload方法时,就会报错,然后自动转向了catch的处理模块。
如果你看过其他后端框架的处理模式,比如:PHP类的框架。你就很能明白这种思想理念所在了,以及它的便捷性了。
后记
说完rrestjs路由,我的主体思想大概就说完了。
非常感谢与rrestjs的作者本人snoopyxdy沟通,中间碰到了很多的一些问题,得以很快解决和理解。
之后打算写一个关于rrestjs路由的改进方案。。。
欢迎来我的github博客yansong.me共同讨论。
自己也尝试的做过路由解析,还算比较简单,但是老吴把很多东西都做了封装改进,效果比我的那个好很多。自己还做过类似java的package机制,书写比较简单,可是没多大意义。3月份用的老吴的框架,后来改成自己的框架,再后来觉得老吴的框架确实很不错,又切回去了,哈哈,老吴大神。。。。
没错,链式处理很灵活 即使不想使用next(‘route’) 也可以通过将需要单独处理的router前置解决,无非是个代码组织加载的问题 个人感觉try catch 也没有errhandler来的优雅~
@yansong 也是后端程序员出身,不觉得express需要配置什么,没有说rrestjs不好,只是觉得express的路由解析已经做得很好,灵活性很强,扩展性也很强,理解起来也简单易懂,仁者见仁吧
不知怎么就被当前端了 赫赫赫 这么点儿内容真谈不上什么奥秘, lz之所以觉得rrestjs比较方便,是因为那短短一行代码里,背后体现的是约定大于配置的组织方式,即reqpath的namespace/resource/component对应controller下一个module
从路由性能上来说rrestjs更快,因为不用匹配路由的正则集,但如@saber 所说express的方式更灵活;
至于config,你完全可以自己写一个,按照自己实际的需要 btw: lz说的next express老版本就有了
@snoopy 这个可以变通一下的
if (/\d/.test(req.path[1])) {
require('./controller/'+ req.path[0] + '/index')(req, res, req.path[1]);
}
同理,比如约定为.html为后缀,这是最常见的方案。像这样: http://cnodejs.org/topic/505c33ee10ccdf8077088e0a.html
写错了。
if (/\d/.test(req.path[1])) {
require('./controller/'+ req.path[0]).index(req, res, req.path[1]);
}
就像@lonevan 说的一样,约定大于配置