全书目录

第十二篇:Express 完全指南 —— 老城区主干道宇宙

第六章:中间件 —— 主干道上的检查站

1 分钟 282 字 第 244 / 962 个阅读单元

中间件是 Express 的灵魂。

它像老城区主干道上的各种设施:

  • 进城登记站
  • 安检口
  • 路况记录器
  • 通行证检查亭
  • 统一错误上报点

一个普通中间件长这样:

js
function logger(req, res, next) {
  console.log(`${req.method} ${req.path}`);
  next();
}

核心三件套:

  • req
  • res
  • next

其中 next() 的意思是:

当前检查站处理完了,放车去下一个站。

#1. 中间件能做什么
text
请求进来
  │
  ├── 记日志
  ├── 校验身份
  ├── 解析 JSON
  ├── 挂载额外信息到 req
  ├── 直接拦截并返回
  └── 放行到下一个处理环节
#2. 最基本的中间件示例
js
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. 中间件顺序极其重要
js
app.use(express.json());

app.use((req, res, next) => {
  console.log('第一个检查站');
  next();
});

app.get('/roads', (req, res) => {
  res.send('道路列表');
});

Express 的执行顺序像这样:

text
请求进入城市
   │
   ▼
按注册顺序经过中间件
   │
   ▼
匹配路由
   │
   ▼
执行路由处理器
   │
   ▼
发出响应
#4. 三种最常见的中间件
#全局中间件:所有车都过
js
app.use(express.json());
app.use(cityLogger);
#路径级中间件:某条路才过
js
app.use('/admin', checkAdmin);
#路由级中间件:某个具体窗口才过
js
app.get('/roads/:roadId', checkToken, (req, res) => {
  res.send('道路详情');
});
#5. 最容易犯的错误:忘记 next()
js
function badMiddleware(req, res, next) {
  console.log('我执行了');
  // 忘了 next(),也没 res.send()
}

结果就是:

车停在检查站,永远不往前走。