章节摘要:本章跟着一颗请求钻进洋葱芯——Application 如何组织中间件队列、执行序为什么是进出对称的、Context 从哪来到哪去、异常沿什么路径冒泡。读完这一章,Koa 对你将不再有黑盒。
第 1 章跑起来的最小应用,收到过一个 GET / 请求。本章的主线就是把这颗请求当摄像机机位,从端口一路跟到内核深处:它先撞上 app.listen 背后的原生 server,被包装成 Context,然后按 app.use 的注册顺序逐层进入中间件;穿到最内层后掉头向外,每一层在出层阶段拿到"响应已定型"的状态,最终由内核统一发送。四次停靠分别是 2.1 的 Application 生命周期、2.2 的穿透执行序、2.3 的 Context 通道、2.4 的错误捕获——整章读完,你会拥有一张 Koa 内部的完整地图,之后每一章的新知识都能挂到这张图上。
new Koa() 到底创建了什么;use、listen、on('error') 三组 API 如何串起一个实例的一生;环境变量与代理配置为什么必须在启动时定。next() 的返回值、忘记 await 的后果,以及"响应在哪一刻定型"。app.on('error') 的分工,一套可直接抄走的错误兜底层写法。本章的认知转折点在 2.2:多数人第一次看洋葱模型图时,以为"出层"是框架额外的机制,其实它只是 async 函数的天然行为——await next() 之后的代码本来就会在内层完成后继续执行,Koa 没有发明任何魔法,它只是把语言能力组织成了纪律。由此得出本章结论:Koa 的核心机制只有一条——用一个 Promise 队列保证中间件按注册序进层、按注册逆序出层;其余一切(Context、错误、生命周期)都是围绕这条队列的服务设施。
一次请求的完整停靠点如下图。

await next() 与提前执行 next() 后代码各自的错乱形态;app.on('error') 的职责分工。内核的地图画完了,但内核自己只提供队列,不提供零件。第 3 章进入卷层工坊:中间件函数的签名规范、常用官方中间件的用法、自定义中间件的封装模式,以及层序对行为与性能的影响——洋葱的价值全在这些层的叠放里。