hapi vs. express [1] —— 路由

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 路由基础

先直接上例子:

// [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 路由基础

同样,直接上例子

// 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按注册顺序,个人是更偏向于优先级处理
  • 两者设计理念不同:一个是配置化,一个是中间件,具体哪个好看个人喜好

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏不止是前端

Vue:Vue中操作DOM方法

4339
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET - 插件接口IModule

  我们知道,要基于平台(容器)+插件的这种模式进行开发,我们必须定义一组契约,用于约束模块插件开发,也就是说,模块插件需要遵守一定的标准进行开发,才能正常被容...

2077
来自专栏mySoul

客户端的js js脚本的引入 js的解析过程

window对象定义了一些属性,用来指定当前窗口的一些信息。通过该属性的引用,可以获取当前窗口的信息

968
来自专栏林德熙的博客

win10 uwp 资源字典 资源的key所有的元素都可以定义资源合并资源字典主题资源共享的资源用户控件资源定义

本文主要翻译ResourceDictionary and XAML resource references - UWP app developer ,里面的代码...

671
来自专栏BeJavaGod

ssm redis 数据字典在J2EE中的多种应用与实现

数据字典在项目中是不可缺少的“基础设施”,关于数据字典如何设计如何实现,今天抽空讲一下吧 先看一下表设计: ? ? 通过自定义标签来实现页面的渲染: ? 再看...

3414
来自专栏SHERlocked93的前端小站

JS 回调模式

如果有个模块 findeNodes() ,任务是找到期望的 DOM 元素并使用 hide() 处理:

561
来自专栏数据分析

Windows PowerShell 学习之——Cmdlet处理生命周期

这一次介绍一下Cmdlet处理过程的生命周期 1. 概述 下图展示Windows PowerShell怎样处理一个管道请求指令。 这个流程包括: 指令参数(pa...

2756
来自专栏Golang语言社区

Golang语言-- gorilla/mux类库解析

golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系。实现简单功...

3626
来自专栏SpringBoot

spingboot 打包jar

https://cloud.tencent.com/developer/support-plan?invite_code=jykf9t9jq2zu

562
来自专栏乐百川的学习频道

Python学习笔记 模块介绍

模块 导入模块 Python官方教程让我们在Python解释器中练习。但是当我们结束解释器,所有的代码都消失了。如果我们希望让代码永久保存的话,就需要将它们保存...

1736

扫码关注云+社区