本文作者:IMWeb 黎清龙 原文出处:IMWeb社区 未经同意,禁止转载
hapi vs. express 1 —— 路由
前言
express 与 hapi 是两个基于 nodejs 的 web server 开发框架,它们由于设计理念的不同,各有优缺点
本文主要介绍hapi和express的路由基础以及区别对比
路由基础
什么是路由,路由是分发的工作,对于web server来说,就是对一个uri进行分发,分发到某个处理该uri的句柄
根据HTTP协议,method uri 可以标定一个事物
因此配置路由其实只需要3项:method,path,handler,接下来看看hapi和express是怎么处理路由的。
hapi 路由基础
先直接上例子:
代码语言:javascript复制// [1]
// in: http://localhost/user/jack/long/aaa
// out: Hello, jack/long/aaa!
//
// [2]
// in: http://localhost/user/jack
// out: Hello, ack!
//
// [3]
// in: http://localhost/user/long
// out: Hello, long!!
server.route([{
method: 'GET',
path: '/{module}/jack/long/aaa',
handler: function(request, reply) {
reply('Hello, this is ' request.params.module '!');
}
}, {
method: 'GET',
path: '/user/{name*}',
handler: function(request, reply) {
reply('Hello, ' request.params.name '!');
}
}, {
method: 'GET',
path: '/user/{name}',
handler: function(request, reply) {
reply('Hello, ' request.params.name '!!');
}
}, {
method: 'GET',
path: '/user/j{name}',
handler: function(request, reply) {
reply('Hello, ' request.params.name '!');
}
}]);
上面的例子展示了hapi的路由基础能力与特性
hapi的路由会把路径按照分隔分("/")切分为item,每一项可以有4个模式:
- 字符串字面量:完全的字符串匹配
- 混合变量:类似abc{p}这种,字符串中混有一个路由变量
- 纯变量:就是{p}
- 通配符:语法是在变量后面加*号,比如{p*},它可以匹配多个路径item
注意一点,每个路径item只能包含一个变量
hapi的路由规则是按照优先级
匹配的,简单的说就是越具体的越高优先级
因此上面4种模式是从高到低的优先级
从上面的例子可以看到hapi的路由规则是依据优先级来匹配的,而不是按照注册路由的顺序来匹配的
hapi接收到一个path的时候,先用分隔符切割为items,然后按顺序
匹配每一个item,每次找出最高优先级匹配的那条路由路径进行匹配,如果该路由可以完全匹配path,那么就选择该路由,例1结果就表明了这一点,不管后面的item匹配度有多高,只要前面有个item优先级低了,整个路由的优先级就低了
hapi路由还有一个特性是配置化,这也是hapi的一个设计理念,配置化让代码一目了然,清晰明了。
express 路由基础
同样,直接上例子
代码语言:javascript复制// in: http://localhost:3000/user/aaa
// out: Hello World!222
app.get('/', function(req, res) {
res.send('Hello World!1');
});
// app.get('/user/:id', function(req, res) {
// res.send('Hello World!' req.params.id);
// });
// app.get('/user/ab?c', function(req, res) {
// res.send('Hello World!');
// });
// app.get([/user/, /user/ab?c', '/user/:id'], function(req, res) {
// res.send('Hello World!');
// });
// app.get(/user/([^_/]*)_([^_/]*)/, function(req, res) {
// res.send('Hello World!' util.inspect(req.params));
// });
app.get(/user/, function(req, res) {
res.send('Hello World!222');
});
app.get('/user/aaa', function(req, res) {
res.send('Hello World!23333');
});
express的路由有4种模式:
- 字符串字面量:完全的字符串匹配
- 路径模式:类似blob的路径匹配规则
- 正则:用正则test去匹配
- 数组:可以让多个path匹配同一个handler
注意,每个item可以有多个匹配,用正则就可以,上面有相应例子
express的路由规则是按路由注册顺序
来匹配的,按照路由表一项一项匹配,匹配上就直接执行handler
express路由的method通过app.xxx来指定,可以看到express的注册路由方式区别于hapi的配置化
另外express的handler可以实现为中间件形式,也就是可以对一个path进行多个handler处理,这也是express的设计理念,具体的可以深入学习express,本文不详述
hapi vs. express
- 同样具有3个基础元素:method,path,handler
- express路由模式更丰富,如果真需要配置复杂路径,hapi可以通过通配符模式,在handler里面再细分处理
- 路由匹配规则不同,hapi按优先级,express按注册顺序,个人是更偏向于优先级处理
- 两者设计理念不同:一个是配置化,一个是中间件,具体哪个好看个人喜好