关于 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. Jumpserver1.4.1安装

    第1章 CentOS环境准备 Jumpserver官网: http://docs.jumpserver.org/zh/docs/step_by_step.html 测试推荐硬件 CPU: 64位双核处 ...

  2. maven-将本地jar包添加到本地仓库

    一.使用场景 1.把网上的jar包下到本地,如果要在maven的pom文件中配置使用,就必须将jar包按照maven的规范添加到maven仓库中,然后再pom中既可以配置引用了. 二.准备工作 1.电 ...

  3. Hdu 1564 1*2矩阵覆盖棋局博弈

    n*n的矩阵如果n为偶数 则可被1*2的矩形完全覆盖 如果n为奇数 则除起点外 其他各自可被1*2矩形完全覆盖 所以当n为偶数 先手赢 n为奇数 后手赢 #include<bits/stdc++ ...

  4. aaa服务器

    验证 授权 记账 authentication\authorization.accounting

  5. git clone报错error: RPC failed; curl 18 transfer closed with outstanding read data remaining

    具体错误信息如下图: error: RPC failed; curl 18 transfer closed with outstanding read data remaining    fatal: ...

  6. java.sql.SQLException: Unknown column 'user0_.user_name' in 'field list' 报错问题

    报错信息: java.sql.SQLException: Unknown column 'user0_.user_name' in 'field list'Query is: select user0 ...

  7. Vue上传通过“服务端签名后直传”上传文件到阿里云 报错 400 Bad Request

    我报错的原因是 formData.append('file', file) 放在签名前面了 解决办法 formData.append('file', file) 一定在最后 /** * 上传文件到 o ...

  8. Ubuntu:笔记本计算机屏幕合盖后进入/不进入休眠设置

    造冰箱的大熊猫,本文在Ubuntu 18.04上验证通过@cnblogs 2019/5/12 1.问题描述 安装有Ubuntu的笔记本计算机与KVM控制器相连,同时一台台式机也与KVM相连.启动笔记本 ...

  9. MessagePack Java Jackson Dataformat 不使用 str8 数据类型的序列化

    老的 msgpack-java(例如 0.6.7)并不支持 MessagePack str8 数据类型. 当你的希望的你的应用程序需要支持老的版本的话,你需要禁用这个数据类型,例如使用下面的语句: M ...

  10. SDOI2015 寻宝游戏 | noi.ac#460 tree

    题目链接:戳我 可以知道,我们相当于是把有宝藏在的地方围了一个圈,求这个圈最小是多大. 显然按照dfs序来遍历是最小的. 那么我们就先来一遍dfs序列,并且预处理出来每个点到根的距离(这样我们就可用\ ...