koa框架
是什么?
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件,通过洋葱模型来使开发更加便捷,。
特性(基于Koa2)
1.丢弃了回调函数,并有效地增强了异常处理
Koa使用Promise配合Async函数实现异步,解决了Node回调地狱的问题。
Koa是通过全局错误事件监听实现对错误的监听,这样把错误处理写在最外层即可。
2.不内置任何中间件,而且中间件模型采用了洋葱模型
不内置任何中间件,好处是使得框架轻量化,让开发者按需安装中间件,更灵活自由。
koa使用洋葱模型作为其中间件模型,可以将中间件级联执行,由用户决定是否向下级中间件执行;而且多个中间件之间通信等变得更加可行和简单。
3.koa提供了执行上下文(Context)
- Koa的Context 将 node 的 request 和 response 对象封装在一起.
- 每接收一个HTTP请求都将创建一个 Context,并在中间件中作为接收器引用,或者 ctx 标识符。
总结来讲,执行上下文可以理解为HTTP请求周期内的作用域环境,来托管请求,响应和中间件,方便它们之间相互访问.
核心机制
koa的洋葱模型
什么是洋葱模型?
洋葱模型是由多个同心层构成,它们相互连接,并朝向代表领域的核心。它是基于控制反转(Inversion of Control,IoC)的原则。该架构并不关注底层技术或框架,而是关注实际的领域模型。洋葱模型各层是通过接口连接的。在领域实体和业务规则构成架构的核心部分时,尽可能将外部依赖性保持在外。
洋葱模型的特点
- 它提供了灵活、可持续和可移植的架构。
- 各层之间没有紧密的耦合,并且有关注点的分离。
- 由于所有的代码都依赖于更深的层或者中心,所以提供了更好的可维护性。
- 提高了整体代码的可测试性,因为单元测试可以为单独的层创建,而不会影响到其他的模块。
- 框架/技术可以很容易地改变而不影响核心领域
Koa中间件的洋葱模型
Express框架
概念
Express是目前流行的基于Node.js运行环境的Web应用程序开发框架,它简洁且灵活,为Web应用程序提供了强大的功能。
Express提供了一个轻量级模块,类似于jQuery(封装的工具库),它把Node.js的HTTP模块的功能封装在一个简单易用的接口中,用于扩展HTTP模块的功能,能够轻松地处理服务器的路由、响应、Cookie和HTTP请求的状态。
特性
- 简洁的路由定义方式。
- 简化HTTP请求参数的处理。
- 提供中间件机制控制HTTP请求。
- 拥有大量第三方中间件。
- 支持多种模版引擎。
核心机制
Express中间件
Express通过中间件接收客户端发来的请求,并对请求做出响应,也可以将请求交给下一个中间件继续处理。
Express中间件指业务流程中的中间处理环节,可以把中间件理解为客户端请求的一系列方法。如果把请求比作水流,那么中间件就是阀门,阀门可以控制水流是否继续向下流动,也可以在当前阀门处对水流进行排污处理,处理完成后再继续向下流动。
使用场景
- 路由保护:当客户端访问登录页面时,可以先使用中间件判断用户的登录状态,如果用户未登录,则拦截请求,直2. 接响应提示信息,并禁止用户跳转到登录页面。
- 网站维护公告:在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,并提示网站正在维护中。
- 自定义404页面:在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,并提示404页面错误信息。
等等
中间件组成
中间件主要由中间件方法和请求处理函数这两个部分构成。中间件方法由Express 提供,负责拦截请求。请求处理函数由开发人员编写,负责处理请求。
常用的中间件方法有app.get()、app.post()、app.use()
模块化路由
虽然可以使用app.get()方法和app.post()方法来实现简单的路由功能,但没有对路由进行模块化管理。在实际的项目开发中,不推荐将不同功能的路由都混在一起存放在一个文件中,因为随着路由的种类越来越多,管理起来会非常麻烦。为了方便路由的管理,通过express.Router()实现模块化路由管理。
express.Router()方法用于创建路由对象route,然后使用route.get()和route.post()来注册当前模块路由对象下的二级路由,这就是一个简单的模块化路由。
koa和express对比
-
koa不在内核中绑定任何中间件,express则内置了一些功能如express.Router()
-
koa原生支持async/await 相比于promise处理异步回调更加优雅。
-
两者对异步的中间件调用顺序是不同的
- express不会等待中间件的异步处理执行完毕,主要是由于内部是通过回调函数的组合,其next的机制导致不会等待异步的完成而继续执行同步操作,当然对于一个中间件的内部使用了async await,执行顺序还是正确的;
- koa的next机制是利用闭包和递归的性质,一个个执行中间件,并且每次执行都是返回promise的封装,再结合generator状态机,实现同步异步的按顺序执行.