宝哥软件园

深入了解Koa框架中间件原理

编辑:宝哥软件园 来源:互联网 时间:2021-08-29

Node主要用于开发web应用,koa是目前Node中最流行的Web框架。

在Node中打开一个http服务是小菜一碟,官网演示。

const http=require(' http ');const server=http . createserver((req,RES)={ RES . statuscode=200;res.setHeader('内容类型','文本/纯文本');RES . end(' Hello World n ');});const主机名=' 127 . 0 . 0 . 1 ';const port=3000server.listen(端口,主机名,()={ console.log(`以http://${hostname}:${port}/`)运行的服务器);});引入http模块,http的createServer方法创建一个http的实例。计算机网络服务器.服务器监听端口3000。我们传递到createServer中的函数实际上是一个回调函数,用于监听请求事件。每当请求进来时,监听功能就会被执行。请求事件的侦听器函数接受两个参数,分别是req和res。其中req是可读流,res是可写流。我们通过req获取http请求的所有信息,并将数据写入res以响应请求。Koa应用

Koa如何创建服务器,直接来官方网站的最后一个例子

const Koa=require(' Koa ');const app=new Koa();//x-response-time app . use(async(CTX,next)={ const start=date . now();等待下一个();const ms=date . now()-start;CTX . set(' X-响应时间',` $ { ms } ms `);});//loggerapp.use(async (ctx,next)={ const start=date . now();等待下一个();const ms=date . now()-start;console . log(` $ { CTX . method } $ { CTX . URL }-$ { ms } `);});//response app . use(async CTX={ CTX . body=' Hello World ';});app . listen(3000);中间件的概念在编程中被广泛使用,无论是前端还是后端,这种实用的模型在实际编程或框架设计中都被使用。

基本上,Koa的所有功能都是通过中间件实现的。

每个中间件默认接受两个参数,第一个参数是Context对象,第二个参数是next函数。只要调用下一个函数,执行权就可以转移到下一个中间件。

如果没有在中间件内部调用下一个函数,那么执行权就不会被传递。

很多中间件会形成一个中间栈,按照“先进先出”的顺序执行。整个过程就像,先堆码,再堆码。

上述代码的执行顺序为:

请求==x-响应时间中间件==记录器中间件==响应中间件==响应时间中间件==响应

了解Koa中间件机制(源代码分析)

阅读源代码并简化它。让我们看看koa中间件系统是如何实现的。

Application类扩展了Emitter { constructor(){ super();this . middleware=[];},使用(fn){ this . middleware . push(fn);归还这个;},回调(){ const fn=compose(this . middleware);返回函数(req,RES){ return fn(CTX);};},听着(.args){ const server=http . createserver(this . callback());return server.listen(.args);}}好了,精简结束了,但是一不小心,只剩下不到20行代码了。

这是框架的核心。简化后的代码非常清晰,有点不可思议,但核心就是这么简单。

让我们首先分析一下上面的代码是做什么的。

我们定义了一个中间件数组来存储中间件。我们设置了一个注册中间件的使用方法。实际上,它只是在向自己的中端阵列推进。我们还使用了一种合成方法,它被传递到中间件中。我们应该做一些处理并返回一个可执行的方法。你一定对中间的作曲方法很好奇。除了这个代码之外的所有代码都很容易理解,但是这个作曲者不知道它到底做了什么。

实际上,compose是整个中间件框架的核心。

除了编写之外,代码已经被明确定义

中间件存储中间件的注册,而组合方法做了最重要的事情

中间件的核心源代码Compose

代码优先

函数compose(中间件){ return function(context,next) { //最后调用的中间件# let index=-1;退货派单(0);函数调度(i) { if (i=index)返回Promise.reject(新的Error('next()'被多次调用'));索引=I;让fn=中间件[I];if (i===中间件. length)fn=next;if(!fn)返回Promise . resolve();尝试{ return Promise . resolve(fn(context,dispatch.bind(null,I ^ 1)));} catch(err){ return Promise . reject(err);} } };}我尝试过简化这个方法,但是方法本身已经足够简单了。

代码非常简洁。

中间件调用通过next()传输实现,结合Promise采用递归调用的通知机制。

看图片。

这种形式的控制流使得整个Koa框架中间件访问采取自上而下的中间件流和自下而上的响应数据流的形式。

Koa本身只定制中间件的编写规范,没有内置任何中间件。一个web请求可以通过Koa中间件栈动态完成响应处理。

Koa使用asyncaware语法以Promise的形式生成程序控制流。

摘要

Koa是一个非常简化的框架,其本质是洋葱模型(中间件模型)。koa框架的中间件模型非常易用简单,但也有自己的缺陷。一旦中间件阵列过大,性能就会下降,需要根据自身情况和业务场景做出最合适的选择。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+