关于 Express

优点。Express 的优点是线性逻辑:路由和中间件完美融合,通过中间件形式把业务逻辑细分,简化,一个请求进来经过一系列中间件处理后再响应给用户,再复杂的业务也是线性了,清晰明了。

再说缺点。Express 是基于 callback 来组合业务逻辑。Callback 有两大硬伤,一是不可组合,二是异常不可捕获。Express 的中间件模式虽然在一定程度上解决这两个问题,但没法彻底解决。

中间件模式就是把嵌套的异步逻辑拉平了,但它也只能是从较宏观的层面解耦顺序执行的异步业务,它无法实现精细的异步组合控制,比如并发的异步逻辑,比如有相对复杂条件控制的异步逻辑。人们通常会要借助 async、bluebird 等异步库。但即便有了这类异步库,当涉及到共享状态数据时,仍然不得不写出嵌套异步逻辑。

对于 callback 的异常不可捕获的问题,下面这个示意想必大家能理会:

someAPI.get(data, function (err, res) {
throw error
})

每个人都不会期望这个 callback 里面 throw 一个异常,但估计每一个写 js 的都写出过这样的异常,这种异常可能会隐藏得很深,callback 模型下它是不可捕获的。

关于 koa

先说优点。首先,借助 promise 和 generator 的能力,丢掉了 callback,完美解决异步组合问题和异步异常捕获问题。
其次,koa 把 express 中内置的 router、view 等功能都移除了,使得框架本身更轻量化。有些人可能会不习惯,但我认为这特别好。首先,把 express 各种中间件移植到 koa 是很简单的一件事;其次,express 中内置的功能件未必好,比如 view,想添加自己的 view engine 进入得做较深层次的 hack,又比如 router,它的效率不是最好的。koa 没有内置这些,给了社区很大的自由度,各位大神都能自由发挥制作出更精细更专业的中间件。当然这带来的另一个问题便是中间件良莠不齐,需要使用者自行甄选。

再说缺点。首先是级联。我把这个东西理解为宏观层面的 callback。Express 中的 callback 问题是微观层面的问题,比如一个中间件内,可能不得不嵌套两三层 callback。但起码,这些 callback 在一起,能一眼看全,能完全掌控。koa 的级联使得所有中间件的逻辑关系变成了 callback 关系。如果项目简单,没问题;如果有高手坐镇,也没问题。当项目业务变庞大变复杂后,当不断有新人进入后,想让所有的开发人员掌握整个项目业务逻辑关系,应该就不是那么简单了。

为什么要有级联,这其实是 promise 带来的副作用:promise 组合体的逻辑不能正常中断!有些 callback 能手初写 promise 时可能就会出现类似这样的逻辑:

someAPI = function (data, callback) {
otherAPI(data)
.then(function (res) {
if (res.something) callback(null, res)
return doOther(res)
})
.then(function (res) {
callback(null, res)
})
.catch(callback)
}

promise 不能正常中断,哪怕你业务逻辑 callback 出去了,后面的 then 会继续运行!这只是个简单的示意,我想强调的任然是 promise 组合体不能正常中断!koa 把你所有的中间件所有的异步业务组合成了一个 promise 组合体。那么,koa 中如果第一个中间挂载了静态文件处理器,后面是 API 业务,当一个静态资源请求第一个中间就处理完毕了怎么办?如果按照 promise then 的逻辑那必然会往后面走,但级联解决了这个问题:所有后续逻辑被封装成 next 了,别调用它,就不会进到后续中间件逻辑。

对于复杂的 koa 项目,要避免使用类似 express 中间件思想来开发,应该尽量发挥 koa 带来的异步控制组合能力,将各种异步业务在各大中间件内组合完毕。

其次是代码安全问题,因为任意一个中间件都能访问到最顶层的 app 对象,第三方模块想作恶,那是完全有机会的。

koa express 优缺点的更多相关文章

  1. express koa koa2 优缺点分析

    发布日期 2009年6月26日,TJ 提交 Express 第一次 commit.目前拥有 5000 多次 commit. 2013年8月17日, TJ 只身一人提交 Koa 第一次 commit.目 ...

  2. koa : Express出品的下一代基于Node.js的web框架

    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...

  3. koa,express,node 通用方法连接MySQL

    这个教程不管node,express,koa都可以用下面方法连接,这里用koa做个参考 这个教程的源码地址: https://github.com/xiaqijian/... 新建文件目录,我是这样子 ...

  4. node.js上除了Express还有哪些好用的web开发框架

    老司机都有体会, 开发本身没有多难, 最纠结其实是最初的技术和框架选型, 本没有绝对的好坏之分, 可一旦选择了不适合于自己业务场景的框架, 将来木已成舟后开发和维护成本都很高, 等发现不合适的时候更换 ...

  5. node+express框架中连接使用mysql经验总结

    最近在学习node.js,做了一个练手项目,使用node.js+express框架,配合mysql数据库和前端vue框架开发一个多人文档编辑系统. koa,express,node 通用方法连接MyS ...

  6. Node.js的框架-express

    Node.js的框架 express 是第三方的 express const express=require('express'); const app=express(); const PORT=3 ...

  7. 前端工作面试问题--摘取自github

    前端工作面试问题 本文包含了一些用于考查候选者的前端面试问题.不建议对单个候选者问及每个问题 (那需要好几个小时).只要从列表里挑选一些,就能帮助你考查候选者是否具备所需要的技能. 备注: 这些问题中 ...

  8. 关于React前端构建的一般过程 - 理论篇

    概要 本文以个人阅读实践经验归纳前端架构构建过程,以Step by Step方式说明创建一个前端项目的过程.并会对每个阶段所使用的技术进行可替代分析,如Express替换Hapi或者Koa的优缺点分析 ...

  9. Node.js开发利器

    开发工具 WebStorm,毫无疑问非他莫属,跨平台,强大的代码提示,支持Nodejs调试,此外还支持vi编辑模式,这点我很喜欢. 做些小型项目用Sublime Text. Browserify:将你 ...

随机推荐

  1. 记录一下linux下两个工具和一个伪代码转换流程图工具

    1.Linux下文本浏览器lynx 文本浏览器,顾名思义就是只有文本的浏览器,这个浏览器可以在命令行下打开使用 2.CURL 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可 ...

  2. AngularJS实现数据列表的增加、删除和上移下移等功能实例

      转: http://www.jb51.net/article/91991.htm 这篇文章给大家分享了AngularJS循环实现数据列表的增加.删除和上移下移等基础功能,对大家学习AngularJ ...

  3. Redis主从复制配置+哨兵模式

    架构设计: master:s0 slave:s1.s2 主机映射信息如下: 192.168.32.100 s0 192.168.32.101 s1 192.168.32.102 s2 1.安装Redi ...

  4. mysql的数据库存放的路径以及安装路径

    1.简单查看路径 1.查看数据库的存放路径 进入mysql终端mysql>show variables like '%datadir%'; 2.查看文件安装路径 [root@hadoop01 e ...

  5. js 原生ajax请求

    什么是ajax 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject). XMLHttpRequest 用于在后台与服务器交换数据.这意味着可 ...

  6. VC++ ID号如何分配

    自动生成的,有默认规则. #define _APS_NEXT_RESOURCE_VALUE 137 //下一个资源ID(插入的一些对话框.图片.图标等) #define _APS_NEXT_COMMA ...

  7. 如何使用Spring Securiry实现前后端分离项目的登录功能

    如果不是前后端分离项目,使用SpringSecurity做登录功能会很省心,只要简单的几项配置,便可以轻松完成登录成功失败的处理,当访问需要认证的页面时,可以自动重定向到登录页面.但是前后端分离的项目 ...

  8. 设置Portainer管理Docker并且开启https(简单方法)

    1. 序言 Portainer是一个十分好用的docker图形化管理界面,可以很方便的查看容器状态,错误log等等. 2. 安装 安装portainer是十分简单的,只需要执行docker pull ...

  9. java中子类继承父类时是否继承构造函数

    来源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.html --------------------- java继承中对构造 ...

  10. nu.random.seed()如何理解

    结论: np.random.seed(a) # 按照规定的顺序生成随机数 # 参数a指定了随机数生成的起始位置: # 如果两处都采用了np.random.seed(a),且两处的参数a相同,则生成的随 ...