中间件的使用案例
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 执行中间件函数。