koa express 优缺点
关于 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 优缺点的更多相关文章
- express koa koa2 优缺点分析
发布日期 2009年6月26日,TJ 提交 Express 第一次 commit.目前拥有 5000 多次 commit. 2013年8月17日, TJ 只身一人提交 Koa 第一次 commit.目 ...
- koa : Express出品的下一代基于Node.js的web框架
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...
- koa,express,node 通用方法连接MySQL
这个教程不管node,express,koa都可以用下面方法连接,这里用koa做个参考 这个教程的源码地址: https://github.com/xiaqijian/... 新建文件目录,我是这样子 ...
- node.js上除了Express还有哪些好用的web开发框架
老司机都有体会, 开发本身没有多难, 最纠结其实是最初的技术和框架选型, 本没有绝对的好坏之分, 可一旦选择了不适合于自己业务场景的框架, 将来木已成舟后开发和维护成本都很高, 等发现不合适的时候更换 ...
- node+express框架中连接使用mysql经验总结
最近在学习node.js,做了一个练手项目,使用node.js+express框架,配合mysql数据库和前端vue框架开发一个多人文档编辑系统. koa,express,node 通用方法连接MyS ...
- Node.js的框架-express
Node.js的框架 express 是第三方的 express const express=require('express'); const app=express(); const PORT=3 ...
- 前端工作面试问题--摘取自github
前端工作面试问题 本文包含了一些用于考查候选者的前端面试问题.不建议对单个候选者问及每个问题 (那需要好几个小时).只要从列表里挑选一些,就能帮助你考查候选者是否具备所需要的技能. 备注: 这些问题中 ...
- 关于React前端构建的一般过程 - 理论篇
概要 本文以个人阅读实践经验归纳前端架构构建过程,以Step by Step方式说明创建一个前端项目的过程.并会对每个阶段所使用的技术进行可替代分析,如Express替换Hapi或者Koa的优缺点分析 ...
- Node.js开发利器
开发工具 WebStorm,毫无疑问非他莫属,跨平台,强大的代码提示,支持Nodejs调试,此外还支持vi编辑模式,这点我很喜欢. 做些小型项目用Sublime Text. Browserify:将你 ...
随机推荐
- 使用HTML5 -Canvas追踪用户,Chrome隐身模式阵亡
中国的一些精准营销公司又要偷着乐了= =从之前追踪Cookie到后面追踪FlashCookie,某些商家总在永无止境的追踪用户行为甚至是隐私,将其转化为所谓的“商业价值”.我们被迫面临“世风日下.道德 ...
- MyBatis---join 查询
在实际业务中,经常能碰到多表关联查询 下面的Demo,讲举例join查询在MyBatis中的实现 User 类: package com.zy.domain; import java.io.Seria ...
- Httpd总结 :HTTPD的基本概念
这是一篇为初学者准备的文章,所以作者会尽量从基础出发,尽量细致的描述每一个细节,以求让初学者不会一头雾水,有一定基础的同学就不用看了,以免浪费你的时间. 假设博主今天春心荡漾,想要访问一些不可描述 ...
- prompt不生效之解决
配置文件路径: /data/mysql/mysql3306/my.cnf [client]port = 3306 [mysql]auto-rehashprompt="\\u@\\h:\\p ...
- 【每日一包0015】gradient-string
[github地址:https://github.com/ABCDdouyae...] gradient-string 用于在终端打印出好看的渐变文字 普通用法 console.log(gradien ...
- 启动SpringBoot web项目出现 Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3,....
详细错误信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> ...
- MySQL-InnoDB锁(一)
本文主要记录InnoDB存储引擎中锁的关键点,下篇文章通过实例确认加锁的范围. InnoDB中的锁 1. 锁提供数据完整性和一致性 2. InnoDB行级锁:共享锁(S)和排他锁(X). 为了支持多粒 ...
- [人物存档]【AI少女】【捏脸数据】精灵
AISChaF_20191101204710076.png
- mysql优化(下)
优化SQL语句:(1)不要使用 select *(2)尽量在where字段上添加索引:(3)模糊查询中%前置不能使用索引,比如 like ‘%a’;(4)使用or语句时,两侧语句都有索引时才使 ...
- ListView如何添加数据如何不闪烁
public class DoubleBufferListView : ListView { public DoubleBufferListView() ...