Express 与 Koa 的中间件如何执行?洋葱模型有什么要求?
先理解原理和示例,再练习完整口述与追问。
回答要点
注册顺序;继续执行条件;Koa await next 前后嵌套;Express4 异步错误显式 next;只响应一次。
原理拆解
中间件是请求处理链上的一个阶段,可读取请求、设置上下文、提前响应或交给后续。Express 常用 req/res/next,顺序由注册与路由匹配决定,错误由错误处理中间件接收。Koa 通常用 async(ctx,next),await next() 会等待下游,因此前半段依次进入,后半段反向返回,形成洋葱。
没有调用 next,下游通常不会继续;Koa 调 next 却不 await/return,外层耗时统计与异常捕获可能提前结束。Express4 中 Promise 拒绝不能默认指望 Express5 的自动传播行为,应显式捕获并交给 next(err)。
示例与推演
Koa A 输出 A1,await next,再输出 A2;B 输出 B1,await next,再输出 B2;终点输出 C,顺序是 A1 B1 C B2 A2。适合在最外层统计耗时、捕获异常,在内层认证和业务响应。深化 32 给出可运行组合器。
易错点
多次 next、重复发送响应、catch 后既吞错又继续成功路径,都可能导致难定位行为。
参考回答可直接练习口述
我把认证、日志和错误等横切逻辑放到明确顺序的中间件。Koa 依赖 await next 形成嵌套返回,Express 按 next 传递控制;具体异步错误行为区分版本,响应或转交只执行一次。