Node系列 · Express:常用的中间件

Node系列 · Express:常用的中间件

Express 的核心能力只有路由和中间件机制------所有"开箱即用"的功能都是中间件实现的。本章盘点最常用的几个内置和第三方中间件。

一、内置中间件(Express 自带)

1.1 express.static:静态资源服务

把指定目录的文件对外暴露成 HTTP 静态资源:

javascript:static-middleware.js 复制代码
app.use(express.static('public'));
app.use(express.static('files'));
// 多个目录按顺序查找
text:public/ 复制代码
├── index.html
├── style.css
└── images/logo.png
bash 复制代码
$ curl http://localhost:3000/index.html
$ curl http://localhost:3000/style.css
$ curl http://localhost:3000/images/logo.png

::: tip

生产环境用 Nginx / CDN 提供静态资源 ------Express 静态中间件适合本地开发和内部工具,高并发场景 Nginx 性能更好。

:::

虚拟路径前缀:

javascript:static-virtual.js 复制代码
app.use('/static', express.static('public'));
// 访问 /static/style.css → public/style.css

1.2 express.urlencoded:解析表单 POST

javascript:urlencoded.js 复制代码
app.use(express.urlencoded({ extended: false }));

// 接收表单提交:name=Alice&age=25
app.post('/login', (req, res) => {
  console.log(req.body);  // { name: 'Alice', age: '25' }
  res.send('ok');
});

extended: falsequerystring 库解析(只支持字符串);extended: trueqs(支持嵌套对象)。

1.3 express.json:解析 JSON POST

javascript:json-parser.js 复制代码
app.use(express.json({ limit: '1mb' }));

// 接收 JSON:{"name":"Alice","age":25}
app.post('/api/users', (req, res) => {
  console.log(req.body);  // { name: 'Alice', age: 25 }
  res.json({ id: 1 });
});
参数 默认值 说明
limit '100kb' 请求体最大体积;防 OOM
strict true 只接受对象 / 数组(不接收字符串 / null)
type 'application/json' Content-Type 匹配规则

二、第三方中间件

2.1 morgan:HTTP 请求日志

bash 复制代码
npm install morgan
javascript:morgan.js 复制代码
const morgan = require('morgan');

app.use(morgan('dev'));           // 开发:彩色简洁
app.use(morgan('combined'));     // 生产:Apache 风格详细

输出示例:

复制代码
:method :url :status :res[content-length] - :response-time ms
GET /api/users 200 42 - 12 ms
格式 用途
combined 生产(详细)
common 生产(中等)
dev 开发(彩色)
short 最简洁
tiny short 更短

写文件:

javascript:morgan-file.js 复制代码
const fs = require('fs');
const accessLog = fs.createWriteStream('access.log', { flags: 'a' });
app.use(morgan('combined', { stream: accessLog }));

2.2 cors:跨域

bash 复制代码
npm install cors
javascript:cors.js 复制代码
const cors = require('cors');

// 允许所有跨域(开发期)
app.use(cors());

// 只允许特定源
app.use(cors({
  origin: ['https://example.com', 'https://admin.example.com'],
  credentials: true,                 // 允许携带 Cookie
}));

详见 第 11 章 cors 中间件

2.3 helmet:安全头

bash 复制代码
npm install helmet
javascript:helmet.js 复制代码
const helmet = require('helmet');

app.use(helmet());

一行给响应加上 11 个安全相关的 HTTP 头:

  • X-Content-Type-Options: nosniff(防 MIME 嗅探)
  • X-Frame-Options: SAMEORIGIN(防点击劫持)
  • Strict-Transport-Security(强制 HTTPS)
  • X-XSS-Protection(XSS 防护)

::: tip

所有生产 Express 项目都建议加 helmet() ------一行代码解决大量安全问题。

:::

2.4 compression:Gzip 压缩

bash 复制代码
npm install compression
javascript:compression.js 复制代码
const compression = require('compression');

app.use(compression());

自动给响应体做 gzip 压缩------文本响应(HTML / JSON)大小可减少 60-80%。

bash 复制代码
npm install cookie-parser
javascript:cookie-parser.js 复制代码
const cookieParser = require('cookie-parser');

app.use(cookieParser('my-secret'));

app.get('/set', (req, res) => {
  res.cookie('token', 'abc123', { httpOnly: true });
  res.send('ok');
});

app.get('/get', (req, res) => {
  console.log(req.cookies);  // { token: 'abc123' }
  res.json(req.cookies);
});

2.6 multer:文件上传

bash 复制代码
npm install multer
javascript:multer.js 复制代码
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/api/upload', upload.single('avatar'), (req, res) => {
  console.log(req.file);
  // {
  //   fieldname: 'avatar',
  //   originalname: 'photo.jpg',
  //   encoding: '7bit',
  //   mimetype: 'image/jpeg',
  //   destination: 'uploads/',
  //   filename: 'xxx-xxxx.jpg',
  //   path: 'uploads/xxx-xxxx.jpg',
  //   size: 12345
  // }
  res.json({ url: `/uploads/${req.file.filename}` });
});

2.7 express-rate-limit:限流

bash 复制代码
npm install express-rate-limit
javascript:rate-limit.js 复制代码
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 60 * 1000,           // 1 分钟
  max: 100,                      // 最多 100 次请求
  message: '请求过于频繁,请稍后再试',
});

app.use('/api', limiter);

防爬虫、防爆破登录接口。

三、中间件选型速查

场景 中间件
静态资源 express.static
解析 JSON body express.json
解析表单 body express.urlencoded
HTTP 日志 morgan
跨域 cors
安全头 helmet
Gzip compression
Cookie cookie-parser
文件上传 multer
限流 express-rate-limit
Session express-session(详见 session
JWT jsonwebtoken(详见 JWT

四、最佳实践

场景 推荐
生产环境必须 helmet + compression + cors
开发环境 morgan('dev')
body 解析 express.json + express.urlencoded
静态资源 开发用内置;生产用 Nginx
限流 公开接口必加(防爆破、防爬虫)
文件上传 限制大小(如 limits: { fileSize: 5 * 1024 * 1024 }

五、小结

  • express.static 提供静态资源服务;express.json / express.urlencoded 解析请求体
  • 第三方必备三件套:morgan(日志)+ helmet(安全)+ compression(压缩)
  • 文件上传用 multer,限流用 express-rate-limit
  • 生产环境最少要:helmet + compression + cors + morgan + body 解析器
  • 中间件按 app.use() 顺序执行;通用中间件在前,业务路由在后
相关推荐
FungLeo42 分钟前
成为全栈·Node 后端篇·框架选型:Express、Koa、Fastify、NestJS 的差异与为何选 Hono
express·koa·nest.js·fastify·hono
时寒的笔记2 小时前
jsvmp04_某yuan宝日志还原rc4
node.js
coderCN2 小时前
Nodejs 第三十四章 数据库(表达式和函数、子查询和连表)
前端·node.js
2601_962181962 小时前
【ROS2 中间件RMW】基于FastDDS共享内存实现ROS2跨进程零拷贝通讯
中间件
未若君雅裁3 小时前
上下文压缩双刃剑-Summarization与ContextEditing中间件实战
python·中间件·langchain
5233AI开发笔记7 小时前
Node.js 调用 API:为什么秘密型 Key 不能放前端
node.js
2601_962076257 小时前
Node.js 完全教程:从入门到精通
node.js
超级码里奥202410 小时前
OpenClaw(龙虾[特殊字符])AI 智能体安装教程
windows·node.js
烂蜻蜓10 小时前
Flask入门教程(十六):中间件与扩展——增强应用功能的两种机制
python·中间件·flask