位置: 编程技术 - 正文

详解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搭建服务器)

  • 合同履约成本资本化
  • 合同甲方乙方收钱付钱涉及什么税金
  • 附加税的税率表
  • 本期实际抵减税额合计0.00不等于
  • 按适用税率计税销售额和按简易办法计税销售额
  • 车辆购置税税收优惠
  • 计入职工福利费的有哪些
  • 零售和批发的界定
  • 利息费用如何在记账软件输入
  • 小规模纳税人能开9个点的发票吗
  • 非股东入资款会计分录怎么写?
  • 会计上的未达账项是什么
  • 公立医院固定资产贷款相关规定
  • 增值税普通发票税率
  • 个人独资企业核定
  • 外籍人士享受满五唯一吗
  • 进口增值税内销可以抵扣吗
  • 小规模人力资源服务费税率
  • 专票已经认证能作废吗
  • 房地产企业售房印花税
  • js监听地址栏
  • 进项发票没认证可以开红字申请单吗
  • 担保公司计提的费用
  • php array数组
  • 怎样选好布艺沙发
  • window10为什么右键就卡住
  • PHP:disk_total_space()的用法_Filesystem函数
  • 阿普拉萨
  • 投资者减除费用60000
  • thinkphp import
  • 负债大于资产能贷款吗
  • 资产负债表各项目年初余额栏内各项数字
  • vue权限管理面试题
  • java继承的基本概念
  • css网页布局代码
  • 拿到领料单如何做账
  • 小规模建筑公司经营范围大全
  • 员工内部罚款能不能抵扣个税
  • 免征增值税的项目可以开专票吗
  • 员工意外伤害保险最多赔多少
  • 城建税退回怎么做分录
  • python卡方分布随机数
  • 微信钱是不是现金
  • sqlserver2019配置
  • 资本公积和盈余公积是什么意思
  • 会计差错更正的会计处理方法
  • 小规模纳税人的增值税计入成本吗
  • 冲销未开票收入还需要申报吗
  • 售后租回交易的表述
  • 补提企业所得税后怎么调整未分配利润
  • 市场费用科目
  • 公司注销资本公积
  • 不动产进项税额转出
  • 高新技术企业财务指标
  • 购买的垃圾袋计入什么科目
  • 影响固定资产折旧的基本因素不包括
  • 企业无形资产入账标准
  • SQL Server 2012 sa用户登录错误18456的解决方法
  • win7 64位旗舰版电脑中如何让EditPlus软件在保存文件时不生成bak文件?
  • redhat linux安装
  • python爬取教程
  • 如何使用ai软件
  • 导入项目出现这个问题
  • unityai寻路
  • js仿QQ中对联系人向左滑动、滑出删除按钮的操作
  • 右键菜单中添加文字
  • python的了解
  • vue如何处理跨域
  • 置顶怎么折叠起来
  • 数据库多表连接的几种方式
  • 日历查询的算法怎么写
  • 使用node
  • 置顶聊天的人怎么不见了
  • python做开发
  • unity3d游戏开发书籍
  • Unity 使用WWW类同步加载资源
  • jqueryon事件
  • 郑州地方税务局网站官网
  • 梦幻西游新区绿色通道多少钱
  • 出口退税函调管理办法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设