位置: 编程技术 - 正文

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

  • 收回已转销的坏账在借方还是贷方
  • 应收账款平均占用资金的变动额
  • 临时设施费怎么结算
  • 建筑企业预收款开票
  • 建筑行业机械租赁费计入什么科目
  • 信用贷的基本准入要求
  • 行政会计账务处理
  • 利息收入属于现金流入吗
  • 增值税普通发票有什么用
  • 营改增后增值税小规模纳税人按什么申报
  • 税务稽查补缴的税款需要申报吗
  • 可抵扣进项税怎么抵扣
  • 普通合伙企业分配利润
  • 赊销方式何时确认收入呢
  • 小规模企业增值税税率是多少
  • 非营利组织免税收入孳生的银行存款利息
  • 季度所得税弥补亏损
  • 受让股东对出让股东抽逃出资
  • 协会收取会员单位的会务费怎么做账
  • 税控专用设备全称是什么
  • 退回多扣的社保费给员工,怎样做会计分录?
  • 成本核算怎么做账
  • Windows11预览体验
  • qconsvc.exe - qconsvc是什么进程 有什么作用
  • PHP:stream_context_set_option()的用法_Stream函数
  • 非合理损耗会计分录
  • 年终奖发放问题
  • window php安装
  • 出口退税退的是啥
  • 准备金要求定义
  • 无形资产入账价值包括资本化支出吗
  • 微服务架构java框架
  • Vue3 中 createWebHistory 和 createWebHashHistory 的区别
  • 房屋装修固定资产置换
  • 支付宝手机网站支付不风控
  • idea如何导入sql文件
  • bootz命令
  • 分公司利润怎么结转给总公司需要交税
  • 培训费属于什么税收分类编码
  • 企业境外收入境内申报
  • pythonsorted函数的作用
  • 建筑安装个人所得税征收管理办法
  • 已计提完的固定资产怎么做账
  • 转让无形资产或其他资产
  • 付承包费计入什么科目
  • 房地产采取按揭销售的,其销售的入账时间为
  • 制造费用期末有余额在借方
  • 收款预缴增值税怎么做账
  • 计量差错引起的原材料盘亏
  • 事业单位的财政拨款怎么做账
  • 油卡办理需要多久?
  • 待处理财产损益会计分录
  • 从银行取现金是什么凭证
  • 计提工资与实发工资有差额怎么计算成本
  • sql触发器语句
  • 扩展什么
  • mysql 报错1045
  • 如何用u盘装系统win10
  • windows server 2008 r2怎么用u盘启动
  • centos云服务器
  • 怎么美化ppt
  • 因为你的策略组阻止
  • win7桌面记事本
  • win8系统怎么改win10
  • ubuntu系统安装报错
  • win8怎么一开机就进入桌面
  • win10系统预览版
  • jquery ztree实现右键收藏功能
  • easyui 日期格式化
  • linux中xargs的含义
  • js 右键
  • 教大家使用灭火器
  • python守护线程与非守护线程
  • javascript中array的正确写法
  • 个税app如何更改扣缴义务人
  • 上海税务局电话多少号
  • 税务贷app
  • 东营为什么没有疫情
  • 云南地税app官方下载
  • 孝感契税缴纳标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设