-
Notifications
You must be signed in to change notification settings - Fork 20
Description
概述
Express和Koa都出自同一个团队,通过对比它们的源码,可以看出来Koa更加成熟,代码更加易读,逻辑更加清晰。
比如:
Express随处可见的var,和Koa的let、const;
Express使用function作为构造函数,而Koa使用class、extend代替;
当然还有框架思想上也是有区别的,请接着往下看。
1. 中间件的入参
Express和Koa都增强了NodeJS原生的http.IncomingMessage和http.ServerResponse,但是Koa还把它们两个都整合到了context上下文对象,并且Koa的中间件可以使用this来替代context。
2. 中间件的处理方式
很多人都说Koa是洋葱模型,而Express是直线模型,其实这样说不严谨。
在中间件都是同步函数的时候,它们的执行结果是一样的;但是,当中间件是异步函数的时候,情况就不一样了,因为Koa的中间件可以返回Promise实例,所以可以通过Promise.then()或者async / await来控制执行顺序,而Express没有支持这个,它只是按照顺序或者可以提前通过next把执行权交给下一个中间件,如果某个中间件是异步函数的,了解过JavaScript的事件循环的话,我们知道结果是不如意的。
所以,换句话说,Express和Koa都是洋葱模型,只是它们处理中间件的方式不同。Express 采用 callback 来处理异步,Koa v1 采用 generator,Koa v2 采用 async/await。
3. 内置模块
相对于Express,Koa没有了内置的路由功能、模板引擎,仅保留了中间件模块。
但是我们可以通过引入kow-router、kow-view等库来实现相同的功能。
作者只是把选择权交给了使用者,但是没有删减功能。
4. 错误处理方式
Express,作为一个中间件来处理
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
Koa,作为一个事件来处理
app.on('error', err => {
log.error('server error', err)
});