探究Express Request中的url

url在解析过程是会被逐级删减。如:

采用第一种写法,浏览器会得到404 Not Found。第二种则正常。原因即在于,url在解析过程是会被逐级删减。

通过node-inspector调试上面的例子,可得到运行中req.url,req.originalUrl,req.baseUrl的值。

解释如下:
req.url = req.originalUrl – req.baseUrl。也是router.get传入的匹配路径的匹配对象。这也就可以解释上面的例子的运行结果了。all,post,put等等函数同理。

req.originalUrl与req.url类似。不同的是,它用于备份最初的请求url,从而你可以随意重写req.url来到处跳转,而不用担心丢失初始的url。比如,用于挂载中间函数的app.use()就会重写req.url来压缩挂载点的长度。

req.baseUrl存储当前router挂载的路径。即app.use('/path', router);。此时/path就是baseUrl。即便在挂载的时候使用的是正则等匹配表达式,baseUrl存储的也会是匹配的字符串,而不是正则表达式。

next函数在Express Router中的应用

例1

运行结果:
Hello!

运行结果:
Hello!
World!

上述例子说明了,next函数的作用是调用挂载在同一路径下的下一个中间函数。换而言之,如果没有next(),这一次request的处理过程就结束了。

例2

换一种写法:

无next函数运行结果:
Hello!

有next函数运行结果:
Hello!
World!

解释

需要说明的是,Express文档中出现了很多次middleware这个词。其本义为中间件,未免太大了,在这里译作中间函数。

中间函数栈是开发者把许多中间函数按一定顺序组织起来的,新收到的请求被开发者定义的第一个中间函数接收并处理,随后被传给下一个中间函数,直到栈底,就像一个自来水管道一样。这也正是为何在Express文档中,next函数的作用被描述为control flow。

Express中的文档中写到:
app.use函数的参数function,可以接受单个函数,多个函数,函数数组,以及混用上述三种形式。这是中间函数栈的一种组成方式,如例2。另一种组织方式为重复多次调用app.use函数来挂载同一路径下的多个函数,如例1。

因此可见,重复多次调用app.use函数来挂载同一路径下的多个函数,与使用多参数传入函数,效果相同。另外,例2又一次佐证了next函数的作用,即传递给控制权给挂载在当前路径的中间函数栈的下一个函数。