Express.js 后端¶
一句话概述:Express 是 Node.js 最流行的 Web 框架,极简灵活,中间件机制强大,是学 Node.js 后端开发的起点,npm 周下载量超过 3000 万。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| Middleware | 中间件 = 请求处理链上的一环(像流水线上的工位) |
| Router | 路由器 = 把 URL 分模块管理 |
| Request/Response | 请求/响应对象 = 封装了 HTTP 请求和响应的操作 |
| Error Handler | 错误处理器 = 统一处理异常的中间件 |
| Template Engine | 模板引擎 = 服务端渲染 HTML(EJS、Pug 等) |
安装配置¶
mkdir myapp && cd myapp
npm init -y # 初始化 npm 项目
npm install express # 安装 Express
npm install cors helmet morgan # 常用中间件
基本使用¶
// app.js
const express = require('express'); // 引入 Express
const cors = require('cors'); // 跨域中间件
const helmet = require('helmet'); // 安全头中间件
const morgan = require('morgan'); // 请求日志中间件
const app = express();
// 中间件
app.use(helmet()); // 安全 HTTP 头
app.use(cors()); // 允许跨域
app.use(morgan('dev')); // 请求日志
app.use(express.json()); // 解析 JSON 请求体
app.use(express.urlencoded({ extended: true })); // 解析 URL 编码
// 路由
app.get('/', (req, res) => {
res.json({ message: 'Hello Express!' }); // 返回 JSON
});
app.get('/api/users/:id', (req, res) => {
const { id } = req.params; // 路径参数
const { fields } = req.query; // 查询参数
res.json({ id, fields });
});
app.post('/api/users', (req, res) => {
const { name, email } = req.body; // 请求体
if (!name || !email) {
return res.status(400).json({ error: '缺少必填字段' }); // 400 错误
}
res.status(201).json({ id: 1, name, email }); // 201 创建成功
});
// 错误处理中间件(必须4个参数)
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: '服务器内部错误' });
});
app.listen(3000, () => console.log('Server running on port 3000'));
Router 模块化¶
// routes/users.js
const router = require('express').Router();
router.get('/', (req, res) => res.json([]));
router.get('/:id', (req, res) => res.json({ id: req.params.id }));
router.post('/', (req, res) => res.status(201).json(req.body));
module.exports = router;
// app.js 中使用
app.use('/api/users', require('./routes/users'));
认证中间件¶
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1]; // 获取 Bearer Token
if (!token) return res.status(401).json({ error: '未提供 Token' });
try {
const decoded = jwt.verify(token, SECRET); // 验证 Token
req.user = decoded; // 附加用户信息到请求
next(); // 继续下一个中间件
} catch (err) {
res.status(401).json({ error: 'Token 无效' });
}
};
app.use('/api/protected', authMiddleware); // 受保护的路由
常见报错¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
Cannot GET /path | 路由未定义 | 检查路由路径和方法 |
req.body is undefined | 未解析请求体 | 添加 express.json() 中间件 |
EADDRINUSE | 端口被占用 | 换端口或 kill 占用进程 |
ERR_HTTP_HEADERS_SENT | 重复发送响应 | 检查是否多次调用 res.send() |
速查表¶
// === 请求对象 ===
req.params.id // 路径参数 /users/:id
req.query.page // 查询参数 ?page=1
req.body // 请求体
req.headers // 请求头
req.method // HTTP 方法
req.path // 路径
// === 响应对象 ===
res.json(data) // 返回 JSON
res.status(201) // 设置状态码
res.send('text') // 返回文本
res.redirect('/url') // 重定向
res.sendFile(path) // 发送文件
res.set('key','val') // 设置响应头
// === 中间件顺序(重要) ===
// 1. 安全中间件(helmet)
// 2. 日志中间件(morgan)
// 3. 解析中间件(json/urlencoded)
// 4. 跨域中间件(cors)
// 5. 路由
// 6. 错误处理中间件(最后)
参考:Express 文档 | 更新于 2026 年