koa中间件梳理(洋葱模型)

【Node】express vs koa 洋葱模型 先看一张图:这张图在网上特别流行,基本搜索一下洋葱模型每篇文章都有这张图来做讲解。比较形象的解释了洋葱模型是在处理请求来和响应请求之间的问题。可以类比栈,先进后出。在洋葱模型中,每一层相当于一个中间件,用来处理特定的功能,比如错误处理、Session处理等等。其处理顺序先是next()前请求(Request,从外层到内层)然后执行next()函数,最后是next()后响应(Response,从内层到外层),也就是说每一个中间件都有两次处理时机。 阅读详情

koa介绍

koa是一个精简的node框架,它主要做了以下事情:

  1. 基于node原生req和res为request和response对象赋能,并基于它们封装成一个context对象。
  2. 基于async/await(generator)的中间件洋葱模型机制。

koa1和koa2在源码上的区别主要是于对异步中间件的支持方式的不同。

  1. koa1是使用generator、yield)的模式。
  2. koa2使用的是async/await+Promise的模式。

koa源码解析

目录

── lib

├── application.js      对应     new  Koa()    || ctx.app
├── context.js                   ctx
├── request.js                  ctx.req || ctx.request
└── response.js                 ctx.res || ctx.response

针对application的use方法讲解洋葱模型

const compose = require('koa-compose');
// 该数组存放所有通过use函数的引入的中间件函数
middleware = [];  
  use(fn) {
     .......
    // 将函数添加进middleware数组
    this.middleware.push(fn);
    return this;
  }
/**
 * thia.misslwwre已经呗use方法将中间件push到middleware数组
 * 在函数式编程中,compose是将多个函数合并成一个函数(组合函数)(形如: g() + h() => g(h())),
 * koa-compose则是将 koa/koa-router 各个中间件合并执行,结合 next() 就形成了洋葱式模型, 相关源码如下。
 */
   callback() {
       const fn = compose(this.middleware);
   }

中间件概念

  1. 匹配路由之前和匹配路由之后执行函数。使用app.use()加载中间件。
  2. 每个中间件都是一个函数(不是函数将报错),接收两个参数,ctx上下文对象,next函数(由koa-compose定义)
  3. 中间件分为:应用级中间件、路由级中间件、错误处理中间件、第三方中间件

中间件工作原理:

  1. 初始化koa实例后,use方法加载中间件(middleware),会有一个middleware中间件数组来存储中间件,use调用顺序会决定中间件的执行顺序。
  2. 在建立好http服务器后,调用koa-compose模块对middleware中间件数组进行处理。

原理就是:
会从middleware数组中取第一个函数开始执行,中间件函数中调用next方法就会去取下一个中间件函数继续执行。每个中间件函数执行完毕后都会返回一个promise对象。(ps:调用next方法并不是表示当前中间件函数执行完毕了,调用next之后仍可以继续执行其他代码)

中间件执行顺序(洋葱模型):

  1. 中间件函数队列,会在最后一个中间件或一个没有调用next的中间件那里停止。
  2. koa官方文档上把外层的中间件称为"上游",内层的中间件为"下游"。
  3. 一般的中间件都会执行两次,调用next之前为第一次,调用next时把控制传递给下游的下一个中间件。当下游不再有中间件或者没有执行next函数时,就将依次恢复上游中间件的行为,让上游中间件执行next之后的代码–洋葱模型

示例一:
代码仅是用于,在命令行观察中间件执行顺序。执行结果自然是1 -> 2 -> 3。
两个函数看做是两个中间件,第一个函数调用next时就会执行第二个中间件函数。
在这里插入图片描述

示例二:
如果第二个函数中存在异步,比如setTimeout(() => {###)}, 2000),那结果就变成1 -> 3 -> 2了。
在这里插入图片描述

示例三:
如果要保证第二个中间件函数执行完毕后,才执行第一个中间件函数next之后的代码的话,就需要使用async/await了要保证中间件2里异步代码执行完毕后,才去执行中间件next函数之后的代码。

具体做法:
第一个中间件使用async/await,第二个中间件返回一个promise对象,执行完毕异步代码后再resolve,调用next()得到的就是第二个中间件返回的数据。
在这里插入图片描述
这样就保证了代码的执行顺序(洋葱模型)

Koa框架实战指南:洋葱模型中间件与Node.js工程化落地 在Node.js服务端开发中,中间件机制是Web框架的核心设计之一。Koa摒弃了传统Express的线性中间件模型,采用洋葱模型让请求处理流程可进可出,配合async/await能够以同步风格编写异步代码,极大降低了异步回调的复杂度和异常处理成本。该设计天然适合封装鉴权、日志、错误处理等通用逻辑,在REST API、BFF层等场景中处于重要位置。本文从实际项目出发,系统梳理Koa的Context上下文用法、中间件注册顺序、常见踩坑案例以及性能优化策略,并通过自定义中间件的完整示例展示工程化落地方法,帮助No 阅读详情

相关推荐

用nTopology五分钟生成三维Voronoi泡沫:节点式建模从原理到实操

多孔结构在增材制造与轻量化设计中应用广泛,其中Voronoi泡沫因其优异的缓冲吸能和比刚度表现备受关注。传统CAD建模需处理复杂布尔运算和网格修复,而隐式建模通过数学场描述几何体,将空间距离与密度分布转化为可视化节点,大幅降低操作门槛。nTopology基于场驱动与参数化逻辑,无需编写命令,即可实时调节胞元尺寸、壁厚及随机种子,快速生成可打印的泡沫实体。这种工作流适用于缓冲垫、医疗植入体、航空支架等场景,也为梯度密度结构与力学仿真验证提供了高效路径。本文围绕三维Voronoi泡沫的生成原理与节点操作流程,详

weixin_26767391的博客 155

Koa 洋葱模型

Koa 洋葱模型 提到 Node.js,就不得不提目前炙手可热的两大框架 Express 和 Koa,他俩都是 NodeJs 的主流开发框架。 Express 和 Koa: Express是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。 Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没

echomsy的博客 1952

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 228

KOA2是什么?详解KOA与KOA2的差别

KOA2是洋葱模型的中间件,如下图所示, 对于服务器而言,它其实就是来处理一个又一个的请求, Web 服务器接收由浏览器发过来的一个又一个请求之后,它形成一个又一个的响应返回给浏览器. 而请求到达我们的服务器是需要经过程序处理的,程序处理完之后才会形成响应,返回给浏览器,我们服务器处理请求的这一块程序,在 Koa2 的世界当中就把它称之为中间件。这个调用顺序就是洋葱模型, 中间件对请求的处理有一种先进后出的感觉,请求最先到达第一层中间件,而最后也是第一层中间件对请求再次处理了一下。

zy1992As的博客 876

Blender建模:对于模型布线的一些思考

Blender布线中一些问题的总结和思考,主要讲述原理和解决方法。

baidu_38797690的博客 1828

VC Spyglass:Lint实战指南之TCL脚本自动化解析

本文详细介绍了如何利用TCL脚本实现VC Spyglass Lint检查的自动化流程。通过实战指南,从基础脚本编写到高级参数化技巧,帮助数字IC设计工程师摆脱手动操作,提升验证效率,并实现与CI/CD流程的集成。

h3i4j的博客 799

Koa 的洋葱模型

概览: Koa的洋葱模型指的是以next()函数为分割点,先由外到内执行Request的逻辑,再由内到外执行Response的逻辑。通过洋葱模型,将多个中间件之间通信等变得更加可行和简单。其实现的原理并不是很复杂,主要是compose方法。 什么是洋葱模型 先来看一个demo const Koa = require('koa'); const app = new Koa(...

ygunoil的博客 442

Sonatype nexus3 数据迁移及升级3.71+(迁移到H2数据库)

nexus3旧版本OrientDB升级H2,及整体迁移nexus3数据到其它服务器。

葫芦娃 5557

Koa的洋葱模型到底是什么?

什么是Koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和res封装成为一个context对象。 基于async/await的中间件洋葱模型机制。 Koa1和Koa2在源码上的区别有何不同? Koa1是使用generator、yield的模式。 Koa2使用的是async/await + Promise的模式。 什么是洋葱模型? Koa的洋葱模型是以next()

Always-Learning 4792

新能源汽车动力总成研发测试技术全景深度报告(2025版)

本文所有企业案例数据均来自上市公司财报、工信部备案信息及权威媒体报道,技术参数经第三方检测报告交叉验证。研发测试人员能力矩阵重构(T型人才进阶路径)[10] 全球动力总成市场2035年预测报告。[9] NI电动汽车HIL测试架构技术文档。[3] 东风汽车智能化研发体系深度报告。[5] 混合动力测功机发明专利技术细节。[1] 领克动力总成试验中心技术解析。[7] 新能源汽车产业迭代趋势白皮书。测试架构师-数字工程。测试架构师-安全合规。测试架构师-人工智能。

优快云-新能源汽车研发测试专业博主 779

手把手教你学Simulink--基于Simulink的机械臂工业装配任务仿真建模

特点高精度要求:装配过程通常需要非常高的位置精度。多步骤操作:一个完整的装配任务可能包含多个连续的子任务,如抓取零件、移动到特定位置、装配等。动态环境:工作环境可能是动态变化的,例如其他机器人或人员在同一空间内工作。挑战复杂性管理:需要处理复杂的运动学和动力学问题,以及可能的碰撞避免。实时性:某些应用场景下需要快速响应以保证生产效率。集成度:需要与其他系统(如传感器、PLC等)无缝集成。首先明确要模拟的装配任务内容。零件的位置和尺寸。装配顺序。

MHD0815的博客 240

Egg 与 Koa:从 async/await 异步模型到洋葱圈中间件的企业级框架演进

本文围绕 Egg 框架与其底层基础框架 Koa 的关系展开,系统梳理 Node.js 异步编程模型的演进、Koa 中间件洋葱圈模型、Context 上下文与异常处理机制,以及 Egg 如何基于 Koa 通过"扩展 + 插件"两大机制构建企业级应用能力。读完本文,你将理解 Egg 各版本与 Koa 的对应关系,掌握 Koa 中间件与 Context 的底层实现原理,并学会通过 `app/extend

gitblog_00695的博客 495

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Egg 与 Koa:从异步编程模型到企业级框架的演进

> 本文以 Egg 官方文档《Egg and Koa》为核心脉络,系统梳理 Node.js 异步编程模型(Callback → Promise → Generator/co → async/await)的演进,深入剖析 Koa 的洋葱模型中间件、Context 与异常处理机制,并结合本仓库源码说明 Egg 如何在 Koa 之上通过扩展(Extend)与插件(Plugin)机制补齐企业级能力,同时回

gitblog_00632的博客 349

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Egg 与 Koa:从异步编程模型到企业级框架的继承与增强

本文以 [docs/source/zh-cn/intro/egg-and-koa.md](https://link.gitcode.com/i/203b5916e3851c1bf461f30786a41bda) 为核心,系统梳理 Egg 框架与 Koa 之间的关系:从 Node.js 异步编程模型的演进(callback → Promise → Generator + co → async fun

gitblog_01135的博客 378

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Koa社区资源大全:学习、开发和贡献的完整指南 [特殊字符]

Koa作为下一代Node.js Web框架,由Express原班人马打造,致力于提供更小、更健壮、更富有表现力的Web开发体验。这个完整的Koa指南将为你呈现全面的学习路径、开发技巧和贡献方式,帮助开发者快速掌握这个强大的框架。无论你是Node.js新手还是经验丰富的开发者,这份Koa社区资源大全都能为你提供宝贵的学习材料。 ## 📚 为什么选择Koa框架? Koa框架采用现代化的异步编程模

gitblog_01194的博客 1053

Egg 与 Koa:从异步编程模型到企业级框架的演进之路

> 本文基于 Egg 官方文档《Egg and Koa》展开,梳理 Node.js 异步编程模型(callback → Promise + Generator → async function)的演进脉络,剖析 Koa 洋葱圈中间件、Context 与异常处理三大设计,并落到当前仓库(egg 1.21.0)源码层面,说明 Egg 如何在 Koa 基础上通过扩展机制与插件机制完成企业级增强。读完你可

gitblog_00799的博客 10

Koa中间件洋葱模型、错误处理与工程实践避坑

在Node.js Web开发中,Koa以轻量、基于async/await的中间件机制受到关注。其核心是洋葱模型:请求按注册顺序进入中间件,await next()挂起并传递控制权,响应阶段再逆序回流,使耗时统计、统一响应体和错误兜底等横切逻辑集中到一层。技术价值在于减少重复代码、明确执行顺序,并提升错误链路与资源释放的可控性。适用于中小型后台接口、BFF、静态资源服务、文件上传下载等场景。理解中间件注册顺序、ctx上下文、next()语义及app.on('error')触发条件,是Koa工程实践稳定上线的关

weixin_34098209的博客 262

node(koa)和python(fastapi)面试

node和python的面试内容

m0_55336994的博客 297

学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理

前言这是学习源码整体架构系列第七篇。整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现。...

azl397985856的专栏 1113

浅析Node中间件Koa&Express:原理和实现

说到中间件,很多开发者都会想到 Koa.js,其中间件设计无疑是前端中间件思想的典型代表之一。 最近重新温习这部分内容,按奈不住想要和各位看官聊聊其中绝妙! Koa用起来非常方便——比之express,它“完美中间件”的设计让功能之间看起来非常简洁!笔者在项目中就曾这样使用过: const Koa=require('koa') const app=new Koa() const Router=require('koa-router') const router=new Router() const cor

flying meng的菜鸟居 7192

Koa 与 Express 全面对比:从设计哲学、中间件模型到技术选型指南

本文基于当前仓库的官方对比文档 [docs/koa-vs-express.md](https://link.gitcode.com/i/d5c52f6c6fc603ca4607da034fc42c9e) 展开,以该文档为骨架、仓库源码(`lib/` 目录、测试与依赖清单)为佐证,系统梳理 Koa 与 Express(以及其前身 Connect)在**设计哲学、功能边界、控制流与错误处理、请求/响应

gitblog_00419的博客 825
上一篇: mongoose建表的一系列骚操作(对象扩展、类上扩展、虚拟属性)
下一篇: anyproxy(实现app抓包)
蛮吉(lambda)
博客等级 码龄7年 2粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值