【Node.js】Express 和 Koa 中间件的区别
1. Express 中间件
特点
- 基于回调链(next 传递控制权)。
- 中间件本质就是
(req, res, next)
的函数。 - 执行顺序是 线性串行,一旦调用
next()
就会交给下一个中间件。
示例
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)
。
示例
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 的中间件是 洋葱模型(更符合异步逻辑)。