什么是Koa?

Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面:

  1. 将node原生的req和res封装成为一个context对象。
  2. 基于async/await的中间件洋葱模型机制。

Koa1和Koa2在源码上的区别有何不同?

  1. Koa1是使用generator、yield的模式。
  2. Koa2使用的是async/await + Promise的模式。

什么是洋葱模型?

Koa的洋葱模型是以next()函数为分割点,先由外到内执行Request的逻辑,然后再由内到外执行Response的逻辑,这里的request的逻辑,我们可以理解为是next之前的内容,response的逻辑是next函数之后的内容,也可以说每一个中间件都有两次处理时机。洋葱模型的核心原理主要是借助compose方法。为了大家更好的理解什么是洋葱模型,这个图很好的给出了解释:

下面是洋葱模型的示例代码:

const Koa = require('koa');//Applications
const app = new Koa();// 中间件1
app.use((ctx, next) => {console.log(1);next();console.log(2);
});// 中间件 2
app.use((ctx, next) => {console.log(3);next();console.log(4);
});app.listen(7000, '0.0.0.0', () => {console.log(`Server is starting`);
});

当我们访问指定路径的7000端口时,中间件的打印顺序是1 -> 3 -> 4 -> 2。

源码解析

  1. use方法

当我们使用中间件的时候,首先是使用use方法,use方法会将传入的中间件回调函数存储到middleware中间件数组中。

  1. listen方法

当执行app.listen去监听端口的时候,其实其内部调用了http模块的createServer方法,然后传入内置的callback方法,这个callback方法就会将use方法存储的middleware中间件数组传给compose函数。

  1. compose方法

compose方法是洋葱模型的核心,compose方法中有一个dispatch方法,第一次调用的时候,执行的是第一个中间件函数,中间件函数执行的时候就是再次调用dispatch函数,也就说形成了一个递归,这就是next函数执行的时候会执行下一个中间件的原因,因此形成了一个洋葱模型。

function compose (middleware) {// ...return function (context, next) {// last called middleware #let index = -1// 一开始的时候传入为 0,后续会递增return dispatch(0)function dispatch (i) {// 假如没有递增,则说明执行了多次if (i <= index) return Promise.reject(new Error('next() called multiple times'))index = i// 拿到当前的中间件let fn = middleware[i]if (i === middleware.length) fn = next// 当 fn 为空的时候,就会开始执行 next() 后面部分的代码if (!fn) return Promise.resolve()try {// 执行中间件,留意这两个参数,都是中间件的传参,第一个是上下文,第二个是 next 函数// 也就是说执行 next 的时候也就是调用 dispatch 函数的时候return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));} catch (err) {return Promise.reject(err)}}}
}

为什么需要洋葱模型?

因为很多时候,在一个app里面有很多个中间件,有些中间件需要依赖其他中间件的结果,洋葱模型可以保证执行的顺序,如果没有洋葱模型,执行顺序可能出乎我们的预期。

参考文献

【Node】深入浅出 Koa 的洋葱模型

Koa的洋葱模型到底是什么?相关推荐

  1. KOA --- 2. 洋葱模型

    一.什么是koa的洋葱模型 特点: 独特的中间件流程控制,就是典型的洋葱模型 二.解析洋葱模型 在两个中间件函数,用 next 隔开 对应的代码Demo const Koa = require('ko ...

  2. koa 中间件洋葱模型源码分析

    中间件基本使用 app.use(async(ctx,next)=>{ctx.state={username:'jeff'};await next();... })app.use(async(ct ...

  3. 聊一聊KOA的洋葱模型

    Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...

  4. 说说你对koa中洋葱模型的理解?

    用过Koa的,肯定对 Middleware(中间件) 有所了解,那我们就用中间件从现象出发,理解洋葱模型 先自定义两个中间件: logTime:打印时间戳 module.exports=functio ...

  5. KOA 初探 洋葱模型

    KOA 官网链接 当然,如果你有express的基础就最好了,毕竟是原班人马开发 常用的指令 npm install koa npm install nodemon touch app.js node ...

  6. Koa核心—洋葱模型

    洋葱模型 koa框架的业务流程是一个完全的异步编程模型,通过ctx上下文对象来贯穿http的上下游.那么我们最重要的就是理解洋葱模型. const koa = require("Koa&qu ...

  7. 洋葱模型php,聊一聊KOA的洋葱模型

    Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...

  8. 你需要掌握的 Koa 洋葱模型和中间件

    大家好,我是前端西瓜哥. Koa 是一个 nodejs 框架,经常用于写 web 后端服务.它是 Express 框架的原班人马开发的新一代 web 框架,使用了 async / await 来优雅处 ...

  9. koa - 洋葱模型浅析

    1.什么是koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和re ...

最新文章

  1. 指纹锁就安全了?防火防盗还得防AI
  2. centos 7手动更改源
  3. 基于图文界面的蓝牙扫描工具btscanner
  4. hdu1337 水题
  5. layui 动态添加 表格数据
  6. 【error】Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs.
  7. 【英语学习】【Level 07】U08 Old Stories L4 Today's headline
  8. ubuntu二进制安装mysql5.6_ubuntu系统中安装mysql5.6(通过二进制)
  9. matlab画图分区_matlab 经典作图
  10. linux指定行添加内容,Linux sed命令在指定行前后添加内容
  11. Mac使用命令行解压rar文件
  12. 网络安全——sql注入漏洞拓扑图
  13. 三维建模初学者学习方法及资料
  14. 【游戏开发环境】Unity使用Mac电脑开发,开发环境的搭建(Mac mini M1 VSCode Git 好用工具)
  15. [bzoj3238]差异
  16. 钱建林出席西古光通成立30周年庆典
  17. vue---安装使用vue-layer弹框插件
  18. java小农养成记第三十五天
  19. html 苹果6尺寸,iPhone6/6 Plus的长度多少厘米?宽度多少厘米?
  20. 表 见 代 理 之 浅 见

热门文章

  1. 纯css自动全屏轮播图html代码,纯CSS3代码实现简单的图片轮播
  2. 每天学一点英文:Espresso 20210814
  3. 一次性永久解决fake_useragent出现的异常: Maximum amount of retries reached
  4. 模拟量0-10V信号控制变频器实现正反转速度随动
  5. Vijos 1391 想越狱的小杉
  6. Ubuntu下重命名文件
  7. Xcode 没有提示
  8. 【SmartSvn】Switch trunk和branch
  9. 【何凯明】非局部连接网络 Non-local Neural Network
  10. Intellij IDEA每次修改JSP都要重启tomcat解决办法