核心目标
掌握 Express 路由、请求 / 响应处理、中间件(核心概念)
路由进阶(GET/POST 请求)
get
var express = require('express');
var router = express.Router();
// GET 请求:获取用户列表
router.get('/list', (req, res) => {
res.json({
code: 200,
msg: '获取用户列表成功',
data: [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' }
]
});
});
module.exports = router;
在 app.js 中注册路由:
var userRouter = require('./routes/user');
app.use('/api/user', userRouter); // 接口前缀 /api/user
处理 POST 请求
- 安装解析 POST 请求的中间件:
npm install body-parser;处理前端json传参。 - 在 app.js 中引入并配置
var bodyParser = require('body-parser');
// 解析 JSON 格式的请求体(前端 Axios 默认提交格式)
app.use(bodyParser.json());
// 解析表单格式的请求体
app.use(bodyParser.urlencoded({ extended: false }));
// POST 请求:新增用户
router.post('/add', (req, res) => {
// 获取前端传递的参数(req.body 类比前端的请求体)
const { name, age } = req.body;
res.json({
code: 200,
msg: `新增用户 ${name} 成功`,
data: { id: 3, name, age }
});
});
中间件(核心)
Express 中间件是框架的 "灵魂",本质是可链式执行的函数,用于拦截和处理 HTTP 请求 - 响应周期的任意环节。它既可以完成通用逻辑(如跨域、日志、请求体解析),也能实现业务逻辑(如权限校验、数据预处理),是 Express 实现灵活扩展的核心机制。
一:基础必备中间件(90% 项目必用)
|----------------------|-----|--------------------------------|-------------------------------------------------------------------------------------------|
| 中间件 / 能力 | 类型 | 核心作用 | 极简用法 |
| express.json() | 内置 | 解析 JSON 格式请求体(替代 body-parser) | app.use(express.json()); |
| express.urlencoded() | 内置 | 解析表单(x-www-form-urlencoded)请求体 | app.use(express.urlencoded({ extended: true })); |
| express.static() | 内置 | 托管静态文件(CSS/JS/ 图片 / HTML) | app.use(express.static('public')); // 或加虚拟前缀:app.use('/static', express.static('public')) |
| cors | 第三方 | 便捷处理跨域(替代手动写跨域头) | npm i cors → const cors = require('cors'); app.use(cors()); |
| morgan | 第三方 | 记录 HTTP 请求日志(开发 / 生产环境适配) | npm i morgan → const morgan = require('morgan'); app.use(morgan('dev')); |
-
express.json()/urlencoded()替代了老版本的body-parser,无需额外安装; -
cors支持精细化配置(如仅允许指定域名):app.use(cors({ origin: 'https://your-domain.com' })); // 仅允许该域名跨域
-
morgan的日志格式:dev(开发环境,简洁)、combined(生产环境,符合 Apache 标准)。
二、身份认证 / 权限中间件(业务核心)
解决 "登录校验、权限控制" 等核心业务需求,是前后端分离项目的必备。
|-----------------|-----|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| express-jwt | 第三方 | 解析 JWT Token,实现无状态身份认证 | npm i express-jwt jsonwebtoken →const jwt = require('express-jwt');app.use(jwt({ secret: 'your-secret', algorithms: ['HS256'] }).unless({ path: ['/api/login'] })); |
| passport | 第三方 | 多策略认证(用户名密码 / 微信 / Google 等) | npm i passport passport-local → 配合策略配置实现多方式登录 |
| express-session | 第三方 | 基于 session 的身份认证(有状态) | npm i express-session →app.use(session({ secret: 'key', resave: false, saveUninitialized: true })); |
关键补充:
express-jwt的unless()用于指定 "无需校验的路径"(如登录接口);express-session需配合cookie-parser使用(存储 sessionID),适合传统服务端渲染项目;- 生产环境中
express-jwt的 secret 需用环境变量存储(避免硬编码)。
三、安全加固中间件(生产环境必备)
提升项目的安全性,防御常见的 Web 攻击(如 XSS、CSRF、HTTP 头漏洞)。
|---------------|-----|---------------------------------|----------------------------------------------------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| helmet | 第三方 | 自动设置安全 HTTP 头(防 XSS / 点击劫持等) | npm i helmet → const helmet = require('helmet'); app.use(helmet()); |
| csurf | 第三方 | 防御 CSRF 攻击(生成 / 验证 CSRF Token) | npm i csurf → 配合 session/cookie 实现 CSRF 校验 |
| rate-limit | 第三方 | 接口限流(防暴力请求 / DDOS) | npm i express-rate-limit →const limiter = rateLimit({ windowMs: 15*60*1000, max: 100 });app.use('/api/', limiter); |
| cookie-parser | 第三方 | 解析 Cookie 数据(配合 session/jwt 使用) | npm i cookie-parser → const cookieParser = require('cookie-parser'); app.use(cookieParser()); |
关键补充:
helmet是 "安全头合集",默认开启 10+ 种安全防护(如 Content-Security-Policy、X-XSS-Protection);rate-limit的windowMs是时间窗口(如 15 分钟),max是窗口内最大请求数(如 100 次)。
四、开发效率 / 调试中间件(开发环境专用)
提升开发效率,减少重复工作(如热重载、接口文档、错误美化)。
|---------------------------|------|-------------------|--------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| nodemon | 开发依赖 | 代码热重载(修改后自动重启服务) | npm i nodemon -D → package.json 加脚本:"dev": "nodemon app.js" |
| express-swagger-generator | 第三方 | 自动生成 Swagger 接口文档 | npm i express-swagger-generator → 配置后自动生成 /api-docs 文档页面 |
| debug | 第三方 | 精细化日志调试(按模块开关日志) | npm i debug → const debug = require('debug')('app:main'); debug('启动服务'); |
| express-error-handler | 第三方 | 美化错误页面(开发环境) | npm i express-error-handler → 替代原生错误中间件,返回可视化错误栈 |
关键补充:
nodemon仅用于开发环境,生产环境用node app.js启动;debug可通过环境变量DEBUG=app:*控制日志输出(如DEBUG=app:router仅打印路由模块日志)。
五、文件处理 / 数据处理中间件
解决 "文件上传、数据验证、数据格式化" 等业务场景需求
|-----------------------|-----|--------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 中间件 | 类型 | 核心作用 | 极简用法 |
| multer | 第三方 | 处理文件上传(multipart/form-data 格式) | npm i multer →const multer = require('multer');const upload = multer({ dest: 'uploads/' });app.post('/upload', upload.single('file'), (req, res) => {}); |
| joi/express-validator | 第三方 | 接口参数校验(防非法数据) | npm i express-validator → 路由中校验 req.body/req.query 字段 |
| compression | 第三方 | 响应数据压缩(gzip),提升传输速度 | npm i compression → const compression = require('compression'); app.use(compression()); |
关键补充:
multer是唯一能处理multipart/form-data的中间件(body-parser不支持);express-validator支持链式校验(如check('username').notEmpty().isLength({ min: 6 }));compression自动压缩响应体(如 JSON/HTML),可减少 70% 传输体积。
六、自定义通用中间件(高频自定义场景)
除了第三方中间件,以下自定义中间件也是项目中高频用到的,可直接复用:
|---------|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| 自定义中间件 | 核心作用 | 核心代码片段 |
| 统一响应格式 | 规范接口返回格式(如 {code, msg, data}) | app.use((req, res, next) => { res.success = (data) => res.json({ code:200, msg:'成功', data }); next(); }); |
| 接口耗时统计 | 记录每个接口的响应耗时(性能分析) | app.use((req, res, next) => { const start = Date.now(); res.on('finish', () => console.log({Date.now()-start}ms)); next(); }); |
| 接口白名单校验 | 仅允许指定 IP / 域名访问接口 | app.use((req, res, next) => { const whiteList = ['127.0.0.1']; if (!whiteList.includes(req.ip)) return res.status(403).send('禁止访问'); next(); }); |