Node.js 中使用 Express 框架系统详细讲解
Node.js 中使用 Express 框架系统详细讲解
一、什么是 Express?
Express 是一个基于 Node.js 平台的极简、灵活且广泛使用的 Web 应用框架。它简化了构建 Web 服务器和 API 的流程,提供了一套丰富的功能,比如路由管理、中间件支持、模板引擎集成等。
二、环境准备
-
安装 Node.js(官网:https://nodejs.org/)
-
初始化项目
mkdir my-express-app cd my-express-app npm init -y # 快速生成 package.json
-
安装 Express
npm install express
三、创建一个简单的 Express 服务器
创建一个文件 app.js
,写入如下代码:
const express = require('express');
const app = express();// 监听端口
const PORT = 3000;// 路由:响应根路径 GET 请求
app.get('/', (req, res) => {res.send('Hello, Express!');
});// 启动服务器
app.listen(PORT, () => {console.log(`Server is running at http://localhost:${PORT}`);
});
运行命令:
node app.js
打开浏览器访问 http://localhost:3000/
,你会看到页面显示 Hello, Express!
四、Express 核心概念讲解
1. 路由(Routing)
Express 通过路由匹配客户端请求的 URL 和 HTTP 方法,来决定如何响应。
app.get(path, handler)
- 处理 GET 请求app.post(path, handler)
- 处理 POST 请求app.put(path, handler)
- 处理 PUT 请求app.delete(path, handler)
- 处理 DELETE 请求
示例:
app.get('/users', (req, res) => {res.send('获取用户列表');
});app.post('/users', (req, res) => {res.send('创建新用户');
});
2. 请求对象(req)和响应对象(res)
req
包含请求相关信息,比如 URL 参数、请求体、查询字符串等res
用来构建响应,常用方法有:res.send()
res.json()
res.status()
res.redirect()
五、中间件(Middleware)
Express 的中间件本质是一个函数,接收三个参数 (req, res, next)
,用于处理请求和响应的过程。中间件可以执行代码、修改请求对象、响应对象,或者结束请求-响应循环。
内置中间件示例
// 解析 JSON 请求体
app.use(express.json());// 解析 URL-encoded 请求体
app.use(express.urlencoded({ extended: true }));
自定义中间件示例
app.use((req, res, next) => {console.log(`${req.method} ${req.url} 时间: ${new Date().toISOString()}`);next(); // 调用 next 传递控制权
});
六、静态资源服务
使用内置的静态中间件 express.static()
来托管静态文件:
app.use(express.static('public'));
将静态文件(如 HTML、CSS、JS、图片)放入 public
文件夹,浏览器即可访问。
七、处理路由参数与查询参数
- 路由参数示例:
app.get('/users/:id', (req, res) => {const userId = req.params.id;res.send(`用户ID: ${userId}`);
});
- 查询参数示例:
app.get('/search', (req, res) => {const keyword = req.query.keyword;res.send(`搜索关键词是: ${keyword}`);
});
八、POST 请求与请求体
客户端通过 POST 发送 JSON 或表单数据时,需要解析请求体。
app.post('/login', (req, res) => {const { username, password } = req.body;res.send(`用户名:${username},密码:${password}`);
});
需要确保已启用 JSON 解析中间件:
app.use(express.json());
九、分离路由(Router)
当项目变大时,可以使用 express.Router()
来分离路由模块:
const express = require('express');
const router = express.Router();router.get('/list', (req, res) => {res.send('用户列表');
});router.post('/add', (req, res) => {res.send('新增用户');
});module.exports = router;
主应用中使用:
const userRouter = require('./routes/user');
app.use('/users', userRouter);
十、错误处理
定义错误处理中间件,必须有四个参数 (err, req, res, next)
:
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('服务器错误');
});
十一、示例完整代码
const express = require('express');
const app = express();app.use(express.json());
app.use(express.urlencoded({ extended: true }));// 自定义日志中间件
app.use((req, res, next) => {console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);next();
});app.get('/', (req, res) => {res.send('Hello, Express!');
});app.get('/users/:id', (req, res) => {res.send(`用户ID: ${req.params.id}`);
});app.post('/login', (req, res) => {const { username, password } = req.body;res.send(`用户名: ${username}, 密码: ${password}`);
});// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('服务器错误');
});const PORT = 3000;
app.listen(PORT, () => {console.log(`Server running at http://localhost:${PORT}`);
});