Koa的洋葱模型到底是什么?
什么是Koa?
Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面:
- 将node原生的req和res封装成为一个context对象。
- 基于async/await的中间件洋葱模型机制。
Koa1和Koa2在源码上的区别有何不同?
- Koa1是使用generator、yield的模式。
- 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。
源码解析
- use方法
当我们使用中间件的时候,首先是使用use方法,use方法会将传入的中间件回调函数存储到middleware中间件数组中。
- listen方法
当执行app.listen去监听端口的时候,其实其内部调用了http模块的createServer方法,然后传入内置的callback方法,这个callback方法就会将use方法存储的middleware中间件数组传给compose函数。
- 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的洋葱模型到底是什么?相关推荐
- KOA --- 2. 洋葱模型
一.什么是koa的洋葱模型 特点: 独特的中间件流程控制,就是典型的洋葱模型 二.解析洋葱模型 在两个中间件函数,用 next 隔开 对应的代码Demo const Koa = require('ko ...
- koa 中间件洋葱模型源码分析
中间件基本使用 app.use(async(ctx,next)=>{ctx.state={username:'jeff'};await next();... })app.use(async(ct ...
- 聊一聊KOA的洋葱模型
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...
- 说说你对koa中洋葱模型的理解?
用过Koa的,肯定对 Middleware(中间件) 有所了解,那我们就用中间件从现象出发,理解洋葱模型 先自定义两个中间件: logTime:打印时间戳 module.exports=functio ...
- KOA 初探 洋葱模型
KOA 官网链接 当然,如果你有express的基础就最好了,毕竟是原班人马开发 常用的指令 npm install koa npm install nodemon touch app.js node ...
- Koa核心—洋葱模型
洋葱模型 koa框架的业务流程是一个完全的异步编程模型,通过ctx上下文对象来贯穿http的上下游.那么我们最重要的就是理解洋葱模型. const koa = require("Koa&qu ...
- 洋葱模型php,聊一聊KOA的洋葱模型
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...
- 你需要掌握的 Koa 洋葱模型和中间件
大家好,我是前端西瓜哥. Koa 是一个 nodejs 框架,经常用于写 web 后端服务.它是 Express 框架的原班人马开发的新一代 web 框架,使用了 async / await 来优雅处 ...
- koa - 洋葱模型浅析
1.什么是koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和re ...
最新文章
- 指纹锁就安全了?防火防盗还得防AI
- centos 7手动更改源
- 基于图文界面的蓝牙扫描工具btscanner
- hdu1337 水题
- layui 动态添加 表格数据
- 【error】Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs.
- 【英语学习】【Level 07】U08 Old Stories L4 Today's headline
- ubuntu二进制安装mysql5.6_ubuntu系统中安装mysql5.6(通过二进制)
- matlab画图分区_matlab 经典作图
- linux指定行添加内容,Linux sed命令在指定行前后添加内容
- Mac使用命令行解压rar文件
- 网络安全——sql注入漏洞拓扑图
- 三维建模初学者学习方法及资料
- 【游戏开发环境】Unity使用Mac电脑开发,开发环境的搭建(Mac mini M1 VSCode Git 好用工具)
- [bzoj3238]差异
- 钱建林出席西古光通成立30周年庆典
- vue---安装使用vue-layer弹框插件
- java小农养成记第三十五天
- html 苹果6尺寸,iPhone6/6 Plus的长度多少厘米?宽度多少厘米?
- 表 见 代 理 之 浅 见
热门文章
- 纯css自动全屏轮播图html代码,纯CSS3代码实现简单的图片轮播
- 每天学一点英文:Espresso 20210814
- 一次性永久解决fake_useragent出现的异常: Maximum amount of retries reached
- 模拟量0-10V信号控制变频器实现正反转速度随动
- Vijos 1391 想越狱的小杉
- Ubuntu下重命名文件
- Xcode 没有提示
- 【SmartSvn】Switch trunk和branch
- 【何凯明】非局部连接网络 Non-local Neural Network
- Intellij IDEA每次修改JSP都要重启tomcat解决办法