表达中间件的使用,原理及实现方法

介绍

这篇文章主要介绍”表达中间件的使用,原理及实现方法”,在日常操作中,相信很多人在表达中间件的使用,原理及实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“表达中间件的使用,原理及实现方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

现在在一些企业里用nodejs做服务端开发已经很普遍了,这里面最火的框架当然要数表达了,快递将nodejs原生的支持的http模块进行了简单封装,使开发者使用起来得心应手。

这其中最方便的便是表达的中间件机制了。在介绍表达的中间件的原理和实现之前咱们先看一下表达中间件如何使用。

表达的中间件机制类似一个漏斗装置,一个请求到达服务端后,这个请求会被抽象成一个要求对象,这个对象会一次进入中间件,在中间件中分别被处理,最后被路由处理函数分发。

如图:

表达中间件的使用,原理及实现方法

代码演示如图:

表达中间件的使用,原理及实现方法

之后启动这个表达服务,不论访问根路径“/盎故恰?a",中间件都会被执行,这说明每次请求这个服务,中间件都会被逐一执行。

那这样做的目的是什么呢?咱们来实现一个需求,需要计算整个网站的pv,也就是整个网站被客户端请求了多杀次,如果不用中间件会如何做呢?看代码:

表达中间件的使用,原理及实现方法

如果使用了中间件呢?再看如下代码:

表达中间件的使用,原理及实现方法

仔细看一下这两份代码的区别,第二份明显简洁了好多,将计算访问量的代码放到中间件中,不需要再在各个路由中分写再去写了,提高了复用性,逻辑表达更清晰,易于维护,以上便是表达中间件的使用了,这里需要注意的是,中间件的调用顺序是从上到下,每个中间件调用完成后必须调用next。

那么中间件机制的原理是什么呢,是如何实现的呢?

看下面一段代码:

 <代码> http var=要求(& # 39;http # 39;); 

函数表达(){

,,var func=[];//待执行的函数数组

,,应用var=function(点播,res) {
,,,我,var=0;

,,,,下一个()函数{
,,,,,任务,var=func (+ +);,//取出函数数组里的下一个函数
,,,,,如果(任务){大敌;,//如果函数不存在,返回
,,,,,,,,返回;
,,,,,}
大敌;,,,,,任务(点播,res,下一个);,//否,则执行下一个函数
,,,,}

,,,接下来,();
,,}

,应用程序。使用=函数(任务){
,,,,funcs.push(任务);
,,}

,,返回应用程序;,,//返回实例
}

应用var=表达();

函数middlewareA(下)要求,res, {
,,console.log(& # 39;中间件1 & # 39;);
,,下一个();
}

函数middlewareB(下)要求,res, {
,,console.log(& # 39;中间件2 & # 39;);
,,下一个();
}

函数middlewareC(下)要求,res, {
,,console.log(& # 39;中间件3 & # 39;);
,,下一个();
}
app.use (middlewareA);
app.use (middlewareB);
app.use (middlewareC);

http.createServer (app) .listen(& # 39; 3000 & # 39;函数(){
,3000年,console.log(& # 39;听.... & # 39;);
});

以上代码便是表达实现中间件机制的核心代码。

简单来说,有如下几点:

<李>

表达函数调用返回一个应用实例

<李>

在表达函数内部定义一个数组来存储中间件函数

<李>

在表达函数内部定义一个app函数

<李>

在应用函数的内部定义一个变量我保存执行的中间件的位置。

<李>

在应用函数中定义一个下一个方法,这个方法通过我值自增调用中间件

<李>

在应用函数内部调用下一个

<李>

在应用函数上定义一个使用方法,这个方法可以将中间件函数推进中间件数组中。

这样的话,表达中间件的调用过程其实就是一个非常多的函数嵌套,形似如下代码:

表达中间件的使用,原理及实现方法

中间件越多嵌套的层级越多。

表达中间件的使用,原理及实现方法