通常我们在浏览器地址栏中访问一个页面时,HTTP请求的URL格式是这样的:
http://host[:port][path]
http:表示一种网络协议。
host:表示主机。
port:表示端口,可选字段,不提供时默认为80。
path:指定请求资源的URI(统一资源标识符),如果URL中没有给出path,一般会默认成”/“(通常由浏览器或者其它HTTP客户端完成补上)
然而,所谓路由,就是如何处理HTTP请求中的路径部分
(比如“http://xxx.com/list/news”这个URL,路由将决定怎么处理/list/news这个路径)
app.get(‘/’,callback)
上面这个代码我们很熟悉了,表示我们添加了一条路由,指定”/“这个路径由get的第二个参数所代表的函数callback来处理。
[下面开始讲Express路由]
来看一下Express的路由定义规则:
app.verb(path,[callback...],callback)
同样,对这个定义公式的每个参数说明一下:
1、verb表示方法,可以是get、post、put、delete等,常用的当然就是前面两个。
2、path表示路径,可以是一个字符串(String),也可以是一个正则表达式(Regex)。
3、callback表示路径处理函数,里面有个next方法,可以用next(),也可以用next('router'),下面我会用实例来说明它们的区别。
由上可见,关于verb只要知道url发送的是get请求和表单可提交post请求数据就行,所以,本篇下面开始就从path和callback两个点来介绍Express路由的几乎所有使用规则。
一、路由中的路径(path)
String:
路径是字符串的情况,举三个例子:
1、匹配/list
在地址栏中输入:
http://localhost:1234/list
浏览器窗口输出:
This is list
2、匹配/list/news
http://localhost:1234/list/news
This is news
3、匹配/list/news/123
http://localhost:1234/list/news/123
This is list news:123
Regex:
路径是正则表达式的情况,举两个例子:
1、匹配/mobile/1[十个数字]
http://localhost:1234/mobile/1开头11位数字
This is a mobile ......
2、匹配abcd和acd
http://localhost:1234/abcd
匹配abcd和acd
好了,这些并不难,在举例子就是讲正则表达式了,哈
二、路由中的句柄(callback)
有关路由中的句柄,这里我讲清楚两个问题:
1、next()和next('route')
这两个方法是路由反馈函数自带的方法。
实例如下图所示:
有三个位置加了next()或者next('route'),我们这里只需要讲清楚这两者的区别,我们就只需要关注位置1,为了让第二个相同路由执行,位置2可以是next(),也可以是next('router'),表示执行下一个相同路由。
通过测试,发现:
当位置1是next()时输出的是:
1234
当位置1是next('router')时输出的是:
134
由此可知,当位置1是next()方法时,会先执行下一个callback,当为next('router')时,会直接跳过下一个callback直接执行下一个相同路由。这也就是二者区别。
2、app.param()
app.param在路由中也相当于是一个中间件的作用,具体看一下下面这个实例:
'listname'的param方法会在’listname‘路由get之前执行。这里一定要强调listname,因为参数是一一对应的。上面这个新实例将输出:
list:item0item1item2
比如我们需要通过一个路由参数去取相应的数据,这个时候通常的做法是写函数来处理,有了param方法后就可以将这些逻辑写在这个方法里了。
三、写到最后总结
当然,Express路由还有一些其它的知识点,比如,app.all(""):能处理任意请求类型,再比如,利用app.route("").get().post().all()实现一个路径处理多个请求方式。这些感觉不是很常用,没有做专门的实现总结 ,感兴趣的童靴可以自己写个DEMO测一下。