node.js Express 中间件是如何实现的呢
文章目录
什么是node.js 的中间件
在整个web请求的生命周期中,
客户端request 过来一个请求,
接着服务器端做出响应处理,
最后response结果给客户端.
上面这个请求过程中,其中服务器端做出响应处理时,会有一系列处理单元,这些处理单元可以简单的理解成中间件.
node.js中间件:
它泛指一种设计模式、一系列的处理单元、过滤器和处理程序;
以函数的形式存在,形成一个异步队列,来完成对数据的预处理和后处理;
它的优点在于灵活处理业务逻辑中的单元模块;
使用中间件我们用极少的操作就能得到一个插件,用最简单的方法就能将新的过滤器和处理程序扩展到现有的系统上.
Express 中间件实现原理
在Express框架中书写中间件代码如下:
var express = require('express');
var app = express();
app.listen(6000, function () {
console.log('listen 6000...');
});
app.use(middlewareA);
app.use(middlewareB);
app.use(middlewareC);
上面引用了 express 包;
然后启动服务监听 6000 端口;
接着我们通过 app.use() 函数加载了3个中间件;
app.use() 到底如何实现的?
我们先来看下中间件函数:
function middleware(req,res,next){
// 准备要做的
// 做完调用下一个函数
next();
}
从上面的函数中我们可以发现此类函数最后一个参数 next 很特别,它像我们数据结构中的链表一样,当前节点通过指针指向下一个节点.
当然这里next 并不是一个指针,它也是一个函数;
它表示函数数组中的下一个函数.
什么是函数数组
express框架内部维护一个函数数组,这个函数数组表示在发出响应之前要执行的所有函数,
也就是把数组里的所有函数全部执行完成后才返回请求结果.
使用app.use(fn)加载中间件后,
传进来的fn就会被扔到这个数组里,
执行完毕后调用next()方法执行函数数组里的下一个函数,
如果没有调用next()的话,就不会调用下一个函数了,也就是说调用就会被终止.