中间件是 Express 的灵魂。
它像老城区主干道上的各种设施:
- 进城登记站
- 安检口
- 路况记录器
- 通行证检查亭
- 统一错误上报点
一个普通中间件长这样:
function logger(req, res, next) {
console.log(`${req.method} ${req.path}`);
next();
}核心三件套:
reqresnext
其中 next() 的意思是:
当前检查站处理完了,放车去下一个站。
#1. 中间件能做什么
请求进来
│
├── 记日志
├── 校验身份
├── 解析 JSON
├── 挂载额外信息到 req
├── 直接拦截并返回
└── 放行到下一个处理环节#2. 最基本的中间件示例
const express = require('express');
const app = express();
function cityLogger(req, res, next) {
console.log(`[进城记录] ${req.method} ${req.url}`);
next();
}
app.use(cityLogger);
app.get('/roads', (req, res) => {
res.send('所有道路');
});
app.listen(3000);#3. 中间件顺序极其重要
app.use(express.json());
app.use((req, res, next) => {
console.log('第一个检查站');
next();
});
app.get('/roads', (req, res) => {
res.send('道路列表');
});Express 的执行顺序像这样:
请求进入城市
│
▼
按注册顺序经过中间件
│
▼
匹配路由
│
▼
执行路由处理器
│
▼
发出响应#4. 三种最常见的中间件
#全局中间件:所有车都过
app.use(express.json());
app.use(cityLogger);#路径级中间件:某条路才过
app.use('/admin', checkAdmin);#路由级中间件:某个具体窗口才过
app.get('/roads/:roadId', checkToken, (req, res) => {
res.send('道路详情');
});#5. 最容易犯的错误:忘记 next()
function badMiddleware(req, res, next) {
console.log('我执行了');
// 忘了 next(),也没 res.send()
}结果就是:
车停在检查站,永远不往前走。