中间件的使用案例
1 | const express = require('express'); |
以上是最简单的例子。一个中间件就是一个函数,参数为req,res,next
。在这个函数中,必须执行next
函数或者发送响应,否者服务会被挂起,客户端会一直处于等待。
为什么要使用中间件
在中间件中可以处理req、res
对象,给他们增加新的方法和属性,供下一个中间件调用,还可以通过next
控制权限,提前中断后续中间件的调用。这样的话就可以将应用的功能拆分出来,实现功能的解耦。
中间件的原理是什么
像connect
内部维护了一个数组,执行app.use
会往这个数组中增加一个中间件。当接收到一个请求时,如果中间件执行了next()
,会依次往下执行。
1 | var http = require('http'); |
注意,这里用了两个闭包,一个维护stack
中间件数组,一个维护中间件函数下标i
。
前面看的是express3
,后面看了express4
源码。
express
不使用 connect
管理中间件了。
一个中间件包含一个 route
属性,当一个请求进来时,循环所有的中间件,next(router)
提前退出,没有定义路由的提前退出,路径不匹配的提前退出。
Route
有 stack
数组,里面都是 Layer
实例,在解析中间件时,Layer
将路由路径转化为正则表达式,并将参数解析,放到他自己本身的属性上,在循环中间件时,req
对象上合并 Layer
的 params
属性。在Route.process_params
回调中调用 Layer.handle_request
执行中间件函数。