当前位置: 首页 > 后端技术 > Node.js

说说KOA的洋葱模型

时间:2023-04-03 19:20:23 Node.js

Koa是一个全新的web框架,由Express背后的原班人马打造,致力于成为更小、表现力更强、更健壮的web应用和API开发领域的基石。通过利用异步函数,Koa可以帮助您放弃回调并大大增强错误处理。Koa没有捆绑任何中间件,而是提供了一套优雅的方法来帮助您快速愉快地编写服务器端应用程序。其实什么是KOA,不用我多说,很多前端朋友都知道或者用过这个东西。下面直接进入正题,说说koa中最重要的概念之一:洋葱模型。什么是洋葱模型?先看一个demo:constKoa=require('koa');//applicationconstapp=newKoa();//middleware1app.use((ctx,next)=>{console.log(1);next();console.log(2);});//中间件2app.use((ctx,next)=>{console.log(3);next();console.log(4);});app.listen(9000,'0.0.0.0',()=>{console.log(`服务器正在启动`);});在浏览器中输入localhost:9000,控制台会打印如下:1342其实很明显,在koa的中间件中,通过next函数将中间件分成两部分,next的上半部分会先执行,而下半部分将在所有后续中间件调用之后执行。先来看一张很经典的图:说到洋葱模型就不得不提到这两张图。我们看第二张图不难发现,会出现两次进入同一个中间件的行为,而且是在所有第一个中间件执行完后,依次返回前面的中间件。洋葱模型大致是这样的,大家可以自己尝一尝,细细品味。为什么要保留洋葱模型我们在使用koa进行开发的时候,因为读取数据库或者http请求都是异步请求,所以我们会使用async/await这个号称异步的终极方案来保证洋葱模型。constKoa=require('koa');constaxios=require('axios');//applicationconstapp=newKoa();//middleware1app.use(async(ctx,next)=>{//使用洋葱模型计算耗时请求conststart=newDate();awaitnext();constdelta=newDate()-start;console.log(`requesttime-consuming:${delta}ms`);});//Middleware2app.use(async(ctx,next)=>{//使用洋葱模型处理后续中间件获取的结果awaitnext();console.log(ctx.baiduHTML);});//中间件3app.use(async(ctx,next)=>{ctx.baiduHTML=awaitaxios.get('http://baidu.com');});app.listen(9000,'0.0.0.0',()=>{console.log(`服务器正在启动`);});上面的例子列出了使用洋葱模型、计时和处理后续中间件返回的结果的一些好处。这也解释了为什么我们需要有保证的洋葱模型。