位置: 编程技术 - 正文

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

  • 不含税价格计算方法
  • 新个税计算公式怎么输入excel
  • 视同销售的增值税如何计算
  • 合伙企业每年费用
  • 上月做其它应付款本月发票到如何做
  • 小规模纳税人所得税费用怎么算
  • 收到以前年度的货款分录
  • 事业单位退休职业年金发放多少个月
  • 二手房屋增值税税率
  • 购入材料过程中支付运费
  • 安全基金提取标准
  • 以前借款没做账现在收回来怎么做账务处理?
  • 企业受托开发软件是什么
  • 境内所得境外发放工资
  • 解聘职工赔偿工资包括哪些
  • 开出增值税发票没收到怎么抵扣进项税?
  • 发票抵扣联什么时候用
  • 滴滴普票可以抵扣进项么
  • 家电折旧费法律依据
  • 土地出让金返还流程
  • 多交的增税怎么做账
  • 建筑行业暂估成本的账务处理
  • 零售行业折扣如何做账?
  • 房地产预缴税金附加可以计提吗
  • 计提折旧会计分录的借方不可能是
  • 苹果系统如何访问相册
  • 错账查找的方法
  • 哪些凭证可以抵扣
  • 你知道怎么安装
  • 在win7中,打开资源管理器的快捷键
  • cortana小娜可以卸载吗
  • PHP:session_is_registered()的用法_Session函数
  • 调制解调器的作用包括
  • 职工福利费会计科目怎么写
  • 采购材料尚未入库款未付的记账凭证
  • php面向对象和面向过程
  • php操作json文件
  • 赡养老人专项附加扣除标准2023年
  • 融资租入的办公楼
  • unipoint
  • modulenotfounderror
  • 什么是现金流量净额
  • 职工福利费的范围有哪些
  • 包工的人工费可以算工程款
  • 固定资产处置科目有哪些
  • 同城票据交换差额户会计分录
  • 进项税和销项税的分录
  • 公司向个人支付居间费用
  • 经济利益的总流入
  • 长期待摊费用的摊销方法
  • 公司注销持股1%的股东需要他签字吗
  • PostgreSQL教程(十一):服务器配置
  • 核定征收企业可以享受研发费用加计扣除
  • 借款与报销流程设计
  • 增值税专用发票电子版
  • 从基本存款账户划款3万元 向开户银行转帐
  • 货币资金里的其他货币资金
  • 加盟费收入需要纳税吗
  • sql server常规错误
  • windows vista
  • srv32.exe - srv32进程是什么文件 有何作用
  • win7本地磁盘图标变了
  • win10的qq
  • win10系统中断怎么解除
  • win10系统无法开机
  • gzip与zip
  • python socket操作
  • 自动化软件安装工具
  • unity3d的
  • linux中crontab的用法
  • html中<
  • python贪吃蛇游戏代码怎么运行
  • bootstrap弹出表单
  • 简述javascript的主要特点
  • python生成随机数据
  • 表单验证js
  • jquery滚动条滚动到指定位置
  • js中如何在div里写入内容
  • 五联发票每一联的作用
  • 内蒙古国家税务局网上电子税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设