外观
Express.js
Express.js 是 Node.js 生态系统中最受欢迎的 Web 应用程序框架,以其极简、灵活和高性能的特性而闻名。它提供了一系列强大的功能,帮助开发者快速构建各种 Web 和移动应用程序。
核心特性
轻量与灵活性:Express 保持了最小的核心设计,你不必被强制的模式或组件束缚,可以自由选择中间件来扩展功能,这使得应用既轻便又可高度定制。
强大的路由系统:Express 提供了直观且强大的路由 API,可以轻松定义基于不同 HTTP 方法和 URL 路径的请求处理逻辑。它支持动态路由参数和正则表达式匹配,使得路由定义既清晰又灵活。
丰富的中间件支持:中间件是 Express 的核心。这些函数在请求和响应周期中执行,允许你以可组合的方式处理请求、添加功能 (如身份验证、日志记录、数据解析) 并影响响应。
广泛的模板引擎支持:框架支持 Jade (现称 Pug)、EJS 和 Handlebars 等多种模板引擎,使开发人员能够轻松创建动态 HTML 内容。
高性能:基于 Node.js 的非阻塞、事件驱动特性,Express 能够高效处理大量并发连接,非常适合 I/O 密集型应用。
庞大的生态系统:作为 Node.js 的基石,Express 拥有丰富的中间件和插件生态,并且社区活跃,可以轻松找到问题的解决方案。
应用结构
一个基本的 Express 应用结构如下所示:
my-app/
├── app.js # 应用入口文件
├── package.json # 项目配置文件
├── public/ # 静态资源目录 (CSS, JS, images)
├── views/ # 模板文件目录
└── routes/ # 路由处理文件目录路由系统
路由是指确定应用程序如何响应客户端对特定端点的请求,该端点是 URI (或路径) 和特定的 HTTP 请求方法 (例如 GET、POST)。
路由的基本结构:
app.METHOD(PATH, HANDLER)app:Express 的实例METHOD:HTTP 请求方法 (小写)PATH:服务器上的路径HANDLER:匹配路径时执行的函数
示例代码:
javascript
const express = require('express');
const app = express();
// 响应根路径的GET请求
app.get('/', (req, res) => {
res.send('Hello World!');
});
// 响应POST请求
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 验证逻辑...
res.send('Login successful!');
});
// 带参数的路由
app.get('/user/:id', (req, res) => {
res.send(`用户 ID: ${req.params.id}`);
});
// 使用正则表达式的路由
app.get('/ab*cd', (req, res) => {
res.send('正则匹配路径');
});中间件机制
中间件函数是能够访问请求对象 (req)、响应对象 (res) 以及应用程序请求-响应周期中下一个中间件函数的函数。它们可以执行任何代码、修改请求和响应对象、结束请求-响应周期,或者调用下一个中间件。
中间件执行流程:
请求 → MIDDLEWARE1 → MIDDLEWARE2 → ... → 路由处理 → 响应自定义中间件示例:
javascript
const express = require('express');
const app = express();
// 简单的日志记录中间件
const logRequest = (req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // 将控制权传递给下一个中间件
};
// 解析 JSON 请求体的中间件
app.use(express.json());
// 应用日志中间件
app.use(logRequest);
// 路由
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('服务器运行在端口 3000');
});常用内置中间件:
express.json():解析 Content-Type 为 application/json 的请求体express.urlencoded():解析 Content-Type 为 application/x-www-form-urlencoded 的请求体express.static():提供静态文件服务
请求与响应对象
请求对象 (Request)
Request 对象表示 HTTP 请求,包含了请求查询字符串、参数、内容、HTTP 头部等属性。
常用属性和方法:
req.params:获取路由参数req.query:获取 URL 查询参数req.body:获取请求主体 (需要 body-parser 中间件)req.path:获取请求路径req.method:获取 HTTP 方法req.get(field):获取指定的 HTTP 请求头
响应对象 (Response)
Response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。
常用方法:
res.send():发送各种类型的响应res.json():发送 JSON 响应res.render():渲染视图模板res.status():设置 HTTP 状态码res.redirect():重定向请求res.sendFile():发送文件作为响应res.set():设置响应头
常用 API 示例
基本服务器设置
javascript
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
// 提供静态文件服务
app.use(express.static('public'));
// 解析 application/json
app.use(express.json());
// 解析 application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }));
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});路由 API
javascript
// 响应不同类型的请求
app.get('/api/users', (req, res) => {
// 获取用户列表逻辑
res.json({ users: [{ id: 1, name: 'John' }] });
});
app.post('/api/users', (req, res) => {
const { name, email } = req.body;
// 创建新用户逻辑
res.status(201).json({ message: 'User created', user: { name, email } });
});
app.put('/api/users/:id', (req, res) => {
const userId = req.params.id;
const { name, email } = req.body;
// 更新用户逻辑
res.json({ message: `User ${userId} updated` });
});
app.delete('/api/users/:id', (req, res) => {
const userId = req.params.id;
// 删除用户逻辑
res.json({ message: `User ${userId} deleted` });
});错误处理中间件
javascript
// 404 处理
app.use((req, res, next) => {
res.status(404).send("抱歉,找不到此页面!");
});
// 错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('服务器内部错误!');
});路由模块化
javascript
// routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('用户列表');
});
router.get('/:id', (req, res) => {
res.send(`用户详情: ${req.params.id}`);
});
module.exports = router;
// app.js
const usersRouter = require('./routes/users');
app.use('/users', usersRouter);模板引擎集成
javascript
// 设置 EJS 作为模板引擎
app.set('view engine', 'ejs');
// 渲染视图
app.get('/about', (req, res) => {
res.render('about', { title: '关于我们', pageName: '关于页面' });
});Express.js 的简洁性和灵活性使它成为 Node.js Web 开发的首选框架。通过中间件和路由系统,你可以构建从简单网站到复杂企业级应用的各种项目。其丰富的生态系统和良好的文档支持,使得开发过程更加高效和愉快。