位置: 编程技术 - 正文

详解express与koa中间件模式对比(koa和express的区别)

编辑:rootadmin

推荐整理分享详解express与koa中间件模式对比(koa和express的区别),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:express和koa2的区别,express和node的关系,express与koa的区别,express和impress,express和node的关系,express和node的关系,express与koa的区别,express与explain,内容如对您有帮助,希望把文章链接给更多的朋友!

起因

最近在学习koa的使用, 由于koa是相当基础的web框架,所以一个完整的web应用所需要的东西大都以中间件的形式引入,比如koa-router, koa-view等。在koa的文档里有提到:koa的中间件模式与express的是不一样的,koa是洋葱型,express是直线型,至于为什么这样,网上很多文章并没有具体分析。或者简单的说是async/await的特性之类。先不说这种说法的对错,对于我来说这种说法还是太模糊了。所以我决定通过源码来分析二者中间件实现的原理以及用法的异同。

为了简单起见这里的express用connect代替(实现原理是一致的)

用法

二者都以官网(github)文档为准

connect

下面是官网的用法:

根据文档我们可以看到,connect是提供简单的路由功能的:

connect的中间件是线性的,next过后继续寻找下一个中间件,这种模式直觉上也很好理解,中间件就是一系列数组,通过路由匹配来寻找相应路由的处理方法也就是中间件。事实上connect也是这么实现的。

app.use 就是往中间件数组中塞入新的中间件。中间件的执行则依靠私有方法 app.handle 进行处理,express也是相同的道理。

koa

相对connect,koa的中间件模式就不那么直观了,借用网上的图表示:

详解express与koa中间件模式对比(koa和express的区别)

也就是koa处理完中间件后还会回来走一趟,这就给了我们更加大的操作空间,来看看koa的官网实例:

很明显,当koa处理中间件遇到await next()的时候会暂停当前中间件进而处理下一个中间件,最后再回过头来继续处理剩下的任务,虽然说起来很复杂,但是直觉上我们会有一种隐隐熟悉的感觉:不就是回调函数吗。这里暂且不说具体实现方法,但是确实就是回调函数。跟async/await的特性并无任何关系。

源码简析

connect与koa中间件模式区别的核心就在于next的实现,让我们简单看下二者next的实现。

connect

connect的源码相当少加上注释也就来行,看起来也很清楚,connect中间件处理在于proto.handle这个私有方法,同样next也是在这里实现的

删掉混淆的代码后 我们可以看到next实现也很简洁。一个递归调用顺序寻找中间件。不断的调用next。代码相当简单但是思路却很值得学习。

其中 done 是第三方处理方法。其他处理sub app以及路由的部分都删除了。不是重点

koa

koa将next的实现抽离成了一个单独的包,代码更加简单,但是实现了一个貌似更加复杂的功能

看着上面处理过的的代码 有些同学可能还是会不明觉厉。

那么我们继续处理一下:

这样一来 程序更加简单了 跟async/await也没有任何关系了,让我们看下结果好了

执行上面的程序我们可以发现依次输出:

foo1bar1qux1qux2bar2foo2

同样是所谓koa的洋葱模型,到这里我们就可以得出这样一个结论:koa的中间件模型跟async或者generator并没有实际联系,只是koa强调async优先。所谓中间件暂停也只是回调函数的原因(在我看来promise.then与回调其实没有什么区别,甚至async/await也是回调的一种形式)。

标签: koa和express的区别

本文链接地址:https://www.jiuchutong.com/biancheng/380919.html 转载请保留说明!

上一篇:使用Node.js实现简易MVC框架的方法(使用nodejs实现简单的局域网聊天功能)

下一篇:详解用node搭建简单的静态资源管理器(如何用node搭建服务器)

  • 销售货物业务的销项税额怎么计算
  • 缴纳所得税的账务处理
  • 固定资产清理的账务处理
  • 城建税 小规模
  • 工会经费应税项怎么算
  • 收入总额的概念
  • 税收专用缴款书
  • 承担客户装修费怎么入账
  • 建筑工程增值税税率是9还是11
  • 投资收益在什么科目
  • 体检中心免税政策
  • 清包工程增值税税率
  • 什么叫项目所在地
  • 小规模纳税人增值税超过30万怎么纳税
  • 什么发票 既可以抵扣又可以退税
  • 分担总部费用
  • 固定资产折旧和累计折旧的区别
  • 个税免税收入和不征税收入
  • 公益性捐赠所得税处理
  • 其他应收款押金计提坏账吗
  • 商品条码续展费怎么退
  • macbookpro提醒事项
  • 收到退回的土地使用税分录怎么做
  • win7为什么现在不能用了
  • pop是什么文件
  • 哪些行业可以简易征收增值税
  • PHP:spl_autoload_unregister()的用法_spl函数
  • 收到公司投资属于什么会计科目
  • 纳税评估一般程序包括
  • 应收款抹零
  • 矿产资源补偿费征收管理规定
  • 阿伦河在哪
  • 个人转让土地使用权可以开专票吗
  • 无法按时交纳税怎么办
  • php编译器与集成环境怎么安装
  • 来料加工成品如何入库
  • 租金收入的所得税率
  • 实际缴纳增值税和应缴纳增值税
  • 金蝶财务软件系统要求
  • 结转入库材料计什么科目
  • 帝国cms如何使用
  • phpcms 用的是什么模板引擎
  • 企业注销需要清产核资吗
  • 以前年度未入账固定资产账务处理
  • 帐载金额
  • 个体工商户怎么年报
  • 税务怎么认定虚列工资
  • 用mysql的小技巧
  • 现金流量表利息支出
  • 住房公积金是怎么来的?
  • 代理进口货物如何确定增值税纳税人
  • 建筑行业挂靠代扣税款如何入账?
  • 增值税红字冲销能跨年吗
  • 投标保证金退还
  • 小规模纳税人如何申请专票
  • 动态sql语句
  • win8 设置
  • win10使用技巧有什么用
  • win10rs2是哪个版本
  • win7系统强制关机
  • win8开机进入开始界面
  • win10开机cpu占用率100%
  • centos7如何设置ip
  • win10如何打开hlp文件
  • win7系统添加右键菜单在哪里设置
  • perl -pi
  • bat读取文件内所有内容
  • python面向对象特征
  • python的遍历
  • 请问在javascript程序中
  • c# /n
  • javascript数据
  • unity?
  • 基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
  • 手机银行如何查询明细
  • 国税局和税务局哪个级别高
  • 税控发票开票软件提示非征期不得抄报税?是什么意思?
  • 誊抄什么意思
  • 苏州税务系统
  • 依法征拆
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设