Express.js 框架教程:从入门到精通
一、Express.js 简介
Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供了一系列强大的特性来帮助创建各种 Web 和移动设备应用。
1.1 Express 的特点
- 轻量级且灵活
- 中间件架构
- 路由系统强大
- 支持多种模板引擎
- 易于集成数据库
1.2 为什么选择 Express
- Node.js 最流行的 web 框架
- 学习曲线平缓
- 庞大的社区支持
- 适合构建 RESTful API
二、环境搭建与基本应用
2.1 安装 Express
# 创建项目目录并初始化
mkdir my-express-app
cd my-express-app
npm init -y# 安装 Express
npm install express
2.2 创建第一个 Express 应用
const express = require('express');
const app = express();
const port = 3000;app.get('/', (req, res) => {res.send('Hello World!');
});app.listen(port, () => {console.log(`Example app listening at http://localhost:${port}`);
});
2.3 运行应用
node app.js
三、核心概念
3.1 路由处理
Express 提供了简单直观的路由定义方式:
// 基本路由
app.get('/', (req, res) => {res.send('GET request to homepage');
});app.post('/', (req, res) => {res.send('POST request to homepage');
});// 路径参数
app.get('/users/:userId', (req, res) => {res.send(`User ID: ${req.params.userId}`);
});// 路由链
app.route('/book').get((req, res) => {res.send('Get a random book');}).post((req, res) => {res.send('Add a book');});
3.2 中间件
中间件是 Express 的核心概念,可以访问请求对象(req)、响应对象(res)和应用程序的请求-响应循环中的下一个中间件函数。
// 应用级中间件
app.use((req, res, next) => {console.log('Time:', Date.now());next();
});// 路由级中间件
app.use('/user/:id', (req, res, next) => {console.log('Request Type:', req.method);next();
});// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Something broke!');
});
3.3 静态文件服务
app.use(express.static('public'));
四、高级特性
4.1 模板引擎集成
Express 支持多种模板引擎,如 Pug、EJS、Handlebars 等。
// 设置 EJS 为模板引擎
app.set('view engine', 'ejs');// 渲染视图
app.get('/', (req, res) => {res.render('index', { title: 'Express App', message: 'Hello there!' });
});
4.2 RESTful API 开发
// 获取资源列表
app.get('/api/users', (req, res) => {res.json([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);
});// 获取单个资源
app.get('/api/users/:id', (req, res) => {res.json({ id: req.params.id, name: 'John Doe' });
});// 创建资源
app.post('/api/users', express.json(), (req, res) => {// req.body 包含请求体res.status(201).json({ id: 3, ...req.body });
});// 更新资源
app.put('/api/users/:id', express.json(), (req, res) => {res.json({ id: req.params.id, ...req.body });
});// 删除资源
app.delete('/api/users/:id', (req, res) => {res.status(204).end();
});
4.3 错误处理
// 同步错误处理
app.get('/error', (req, res) => {throw new Error('BROKEN'); // Express 将捕获此错误
});// 异步错误处理
app.get('/async-error', (req, res, next) => {fs.readFile('/file-does-not-exist', (err, data) => {if (err) {next(err); // 将错误传递给 Express} else {res.send(data);}});
});
五、项目结构与最佳实践
5.1 推荐的项目结构
my-express-app/
├── node_modules/
├── config/
│ └── config.js
├── controllers/
│ └── userController.js
├── models/
│ └── userModel.js
├── routes/
│ └── userRoutes.js
├── public/
│ ├── css/
│ ├── js/
│ └── images/
├── views/
│ └── index.ejs
├── app.js
└── package.json
5.2 路由分离示例
// routes/userRoutes.js
const express = require('express');
const router = express.Router();router.get('/', (req, res) => {res.send('User list');
});router.get('/:id', (req, res) => {res.send(`User ID: ${req.params.id}`);
});module.exports = router;// app.js
const userRoutes = require('./routes/userRoutes');
app.use('/users', userRoutes);
5.3 环境变量管理
使用 dotenv
管理环境变量:
npm install dotenv
创建 .env
文件:
PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
在应用中加载:
require('dotenv').config();const port = process.env.PORT || 3000;
// ...
六、部署与性能优化
6.1 生产环境部署
- 使用
NODE_ENV=production
环境变量 - 使用进程管理器(如 PM2)
- 启用 Gzip 压缩
- 设置正确的安全头
6.2 性能优化技巧
// 启用压缩
const compression = require('compression');
app.use(compression());// 启用缓存
const apicache = require('apicache');
const cache = apicache.middleware;
app.get('/api/expensive-route', cache('5 minutes'), (req, res) => {// 昂贵的操作
});// 集群模式
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;if (cluster.isMaster) {for (let i = 0; i < numCPUs; i++) {cluster.fork();}
} else {// 启动 Express 应用
}
七、常见扩展与插件
7.1 常用中间件
body-parser
: 解析请求体cookie-parser
: 解析 cookiemorgan
: HTTP 请求日志记录helmet
: 安全相关 HTTP 头设置cors
: 跨域资源共享支持
7.2 数据库集成
// MongoDB (Mongoose)
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myapp');// MySQL
const mysql = require('mysql2');
const connection = mysql.createConnection({host: 'localhost',user: 'root',database: 'test'
});
八、实战项目:构建一个博客系统
8.1 项目需求
- 用户认证
- 文章发布
- 评论功能
- 分类管理
8.2 核心代码示例
// 用户认证路由
const passport = require('passport');app.post('/login', passport.authenticate('local', { successRedirect: '/',failureRedirect: '/login',failureFlash: true })
);// 文章路由
app.get('/posts', postController.getAllPosts);
app.post('/posts', authMiddleware, postController.createPost);
app.get('/posts/:id', postController.getPost);
app.put('/posts/:id', authMiddleware, postController.updatePost);
app.delete('/posts/:id', authMiddleware, postController.deletePost);
九、学习资源与进阶方向
9.1 推荐学习资源
- Express 官方文档
- Express 中文文档
- 《Node.js 实战》
- 《Express in Action》
9.2 进阶方向
- 深入中间件开发
- 微服务架构
- GraphQL API 开发
- Serverless 部署
- 性能监控与调优