大家能不能简单的讲讲,或者有什么这方面的博文推荐链接的吗?
严格上讲,并不是 Node 的中间件,而是 Express 里的中间件,而 Express 中的中间件理念,直接来自于 Connect 这个模块。
Connect 的简介是“Connect is a middleware layer for Node.js”,所以你所说的中间件,应该就是指的这个。
中间件的流程是,接收统一格式的参数,执行操作,然后调用下一个中间件。每一次操作,相对其它的操作都是独立的。也不会直接性的去干涉其它的中间件。
而对于一般的请求来讲,像在 Express 里面,有很多操作利用中间件来实现就比较合理,比如:
用户的身份与鉴权
参数的判断、格式化、筛选等
路由的处理
记录日志
在调用一个中间件时,一般包括以下几个参数:
req 请求对象
res 响应对象
next 调用下一个中间件的方法
id 路由中间件传的路由参数
前三个必有,后一个一般没有。
比如,下面就是一个最简单的中间件:
app.use(function(req, res, next){
console.log('simple middleware');
next();
});
这里啥都没干,只打印了一句话。
每个中间件对 req
/ res
对象的修改,其它的中间件也可以读取。
express
官网是这么解释middleware
是做什么的:
中间件(
middleware
)函数能够访问请求对象 (req
)、响应对象 (res
) 以及应用程序的请求/响应循环中的下一个中间件(middleware
)函数。下一个中间件函数通常由名为next
的变量来表示。
我们常见的middleware
大概是这样的:
//这里就有刚才提到的req, res和next
//next就是下一个middleware
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
//卧槽,我就是上面那个里面的next
app.use(function (req, res, next) {
console.log('I am the fucking "next" mentioned above');
next();
});
中间件函数可以执行以下任务:
执行任何代码。
对请求和响应对象进行更改。
结束请求/响应循环。
调用堆栈中的下一个中间件函数。
我们用一个图来表示中间件(middleware
)在应用程序中的形态:
盗图,作者勿怪,发现即通知,我一定删除!
那四个蓝色的方块就是四个不同功能的中间件(middleware
),当一个请求从客户端发过来:
第一个cors
先处理(就是给res
加了一堆header
),这里肯定不会直接返回请求,因为她不是业务主体,只是修改了res
对象,然后调用next
执行下一个middleware
第二个csrf
又处理(搞了什么自己去查好了),然后再调用next
第三个auth
再处理(看名字也知道是一些鉴权的工作),调用next
第四个main
,通常就是你的业务主体了,或者渲染一个模板、或者返回一段json
,总之到此就结束了。(结束,通常是res.render
或者res.send
之类的方法,把真正的数据返回)
于是,客户端就拿到了响应的数据。
中间件最大的好处就是AOP
(面向切面编程),譬如我想为所有的业务逻辑加一个日志,记录操作正确还是失败,还有响应时间,你想想,是直接在cors
前面再加一个中间件让他统筹所有的请求好呢?还是你挨个儿在自己每一个业务主体的代码里手写一堆与业务无关的日志代码好!