【Node.js】Express 和 Koa 中间件的区别

1. Express 中间件

特点

  • 基于回调链(next 传递控制权)
  • 中间件本质就是 (req, res, next) 的函数。
  • 执行顺序是 线性串行 ,一旦调用 next() 就会交给下一个中间件。

示例

js 复制代码
const express = require('express')
const app = express()

// 中间件1
app.use((req, res, next) => {
  console.log('middleware 1 start')
  next() // 交给下一个
  console.log('middleware 1 end') // 不会等后面的异步
})

// 中间件2
app.use((req, res, next) => {
  console.log('middleware 2')
  next()
})

app.listen(3000)

👉 特点是 没有"洋葱模型",执行顺序就是一条直线:

复制代码
middleware 1 start
middleware 2
middleware 1 end   // 注意这里不是"包裹",而是直接继续执行

2. Koa 中间件

特点

  • 基于 async/await 实现。
  • 使用的是 洋葱模型:先进入外层中间件 → 一直到底 → 然后再从底层往外层"返回"。
  • 中间件函数签名:async (ctx, next)

示例

js 复制代码
const Koa = require('koa')
const app = new Koa()

// 中间件1
app.use(async (ctx, next) => {
  console.log('middleware 1 start')
  await next() // 等待下一个中间件完成
  console.log('middleware 1 end') // 这里会在"返回来"的时候执行
})

// 中间件2
app.use(async (ctx, next) => {
  console.log('middleware 2 start')
  await next()
  console.log('middleware 2 end')
})

app.listen(3000)

👉 执行顺序:

复制代码
middleware 1 start
middleware 2 start
middleware 2 end
middleware 1 end

这就是 典型的洋葱模型


3. 核心区别总结

特性 Express Koa (2.x)
中间件形式 (req, res, next) async (ctx, next)
控制流 next() 直接进入下一个 await next() 形成洋葱模型
上下文对象 req + res 分开 统一 ctx 封装请求响应
异步处理 需要手动调用 next 并处理回调 基于 async/await,天然异步
可读性与优雅性 回调风格,复杂逻辑容易乱 更优雅、直观

📌 一句话总结

  • Express 的中间件是 线性流水线
  • Koa 的中间件是 洋葱模型(更符合异步逻辑)。
相关推荐
小林ixn2 小时前
Node.js 文件系统与路径处理:从 API 到工程化实战
node.js·编辑器·vim
heimeiyingwang9 小时前
【架构实战】分库分表实战:ShardingSphere与中间件选型
中间件·架构
iDao技术魔方13 小时前
Node.js v26.5.0 深度解读:import Text、流式 ReadableStreamTee、以及隐藏的安全加固浪潮
安全·node.js
斯蒂文66813 小时前
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
缓存·中间件
网络点点滴14 小时前
Node.js中模块引用是如何真正运作的
node.js
BAIGAOa15 小时前
还在手写 if-else 响应按键?我用 React-Ink 搭配键盘引擎解决了
node.js
STDD15 小时前
Traefik 中间件深度配置:限流、认证、IP 白名单与错误页面定制
网络协议·tcp/ip·中间件
Excel效率人17 小时前
飞书自动回复机器人开发:@机器人自助查询物流信息
机器人·node.js·飞书
先吃饱再说1 天前
从“地狱”到“楼梯”再到“同步写法”:Node.js 异步的二十年与Node内置fs模块详解
node.js
知识收割者1 天前
Nodejs也能写Agent - 10.LangChain篇 - 初识LangChain
node.js