一、Express框架概述
Express是一个基于Node.js的轻量级Web应用程序开发框架,通过中间件机制和路由系统简化了HTTP服务器的创建流程。作为MEAN技术栈的核心组件之一,它已成为Web开发领域最受欢迎的Node.js框架。
核心特点
- 极简主义设计:仅提供最核心的功能,便于开发者根据需求进行扩展
- 高度灵活性:不强制特定的项目结构,开发者可自由组织代码
- 丰富的中间件生态系统:拥有庞大的社区支持和第三方中间件
- 轻量级性能:保持框架核心小巧,运行效率高
- 社区活跃:文档完善,支持强大,截至2024年,最新版本为5.0 beta
二、安装与快速入门
安装步骤
javascript
# 创建项目目录
mkdir my-express-app
cd my-express-app
# 初始化npm项目
npm init -y
# 安装Express
npm install express
创建第一个应用
javascript
// app.js
const express = require('express');
const app = express();
const port = 3000;
// 定义路由
app.get('/', (req, res) => {
res.send('Hello World!');
});
// 启动服务器
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});
运行命令:
javascript
node app.js
访问http://localhost:3000即可看到"Hello World!"消息。
三、核心概念详解
1. 路由系统
路由是Express应用的核心,负责定义应用如何响应客户端请求
基础路由示例:
javascript
// GET请求
app.get('/users', (req, res) => { ... });
// POST请求
app.post('/users', (req, res) => { ... });
// 动态参数
app.get('/users/:id', (req, res) => {
res.send(`用户ID: ${req.params.id}`);
});
路由参数获取:
req.params:获取路径参数(如/user/123中的123)req.query:获取查询参数(如/search?q=keyword中的keyword)
2. 中间件机制
中间件是Express的灵魂,它允许在请求和响应之间执行各种操作。
中间件类型:
- 应用级中间件 :通过
app.use()注册,作用于所有请求 - 路由级中间件 :通过
router.use()注册,仅作用于特定路由 - 错误处理中间件 :专门处理错误,格式为
function(err, req, res, next) - 内置中间件 :如
express.static()用于静态资源服务 - 第三方中间件 :如
body-parser(现已被内置)、morgan等
中间件执行顺序:
javascript
// 日志中间件
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // 传递控制权
});
// 静态文件服务
app.use(express.static('public'));
// 请求体解析
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
3. 请求与响应对象
Request对象常用属性:
req.ip:客户端IP地址req.method:HTTP方法(GET、POST等)req.url:请求URLreq.params:路径参数req.query:查询参数req.body:请求体数据(需配合body解析中间件)
Response对象常用方法:
res.send():发送文本响应res.json():发送JSON响应res.status():设置HTTP状态码res.redirect():重定向到其他URLres.render():渲染模板
四、高级特性与最佳实践
1. 模块化路由设计
随着项目增长,路由定义容易变得混乱。Express提供的路由分离功能可以完美解决这个问题:
javascript
// 创建独立的路由文件
// routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => { ... });
router.get('/:id', (req, res) => { ... });
router.post('/', (req, res) => { ... });
module.exports = router;
// 在主应用中挂载
const userRouter = require('./routes/users');
app.use('/api/users', userRouter);
这种设计带来以下优势:
- 关注点分离:每个路由模块专注于特定业务领域
- 可维护性提升:修改特定功能时只需关注对应路由文件
- 测试友好:独立模块更容易进行单元测试
- 扩展性增强:新功能可通过添加新路由模块轻松实现
2. 模板引擎集成
Express支持多种模板引擎,如EJS、Pug、Handlebars等:
javascript
// 设置模板引擎
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
// 渲染模板
app.get('/', (req, res) => {
res.render('index', { title: 'Express 首页' });
});
3. 静态资源托管
javascript
// 托管public目录下的静态资源
app.use(express.static('public'));
// 带路径前缀的静态资源
app.use('/static', express.static('public'));
4. 错误处理最佳实践
javascript
// 404错误处理
app.use((req, res, next) => {
res.status(404).send('页面未找到!');
});
// 全局错误处理
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: '服务器内部错误' });
});
五、适用场景与项目结构
适用场景
- 快速构建原型系统:非常适合快速验证想法
- 开发微服务架构中的API网关:作为服务入口
- 改造传统Web应用为云函数:支持与Azure Functions等云服务平台集成
推荐项目结构
javascript
project/
├─ app.js
├─ routes/
│ ├─ index.js
│ └─ users.js
├─ controllers/
│ └─ userController.js
├─ models/
│ └─ userModel.js
├─ views/
│ └─ index.ejs
├─ public/
│ └─ style.css
└─ package.json
这种分层架构不仅便于单元测试,也为后续集成数据库、添加身份认证、引入缓存或微服务拆分预留了清晰的演进路径。