📚前言
用Trae开发平台,跟着AI,学习Express框架
环境准备
安装Trae、node.js
开始~
提示词
我是一个新手程序员,已安装trae,请为我编写Express框架教程,从浅入深,包括原理与实践。如因输出字数限制,可以提示我,分多次输出。

扶稳做好,👨🏫跟着AI老师飞入知识的海洋🌊
我来为你创建一个完整的Express框架教程,从基础到高级,包括原理与实践。让我先检查当前目录结构,然后开始创建教程文件。
xstudy
我看到你的工作目录是空的,我将为你创建一个完整的Express框架教程项目。让我从基础开始,逐步创建教程文件。
Express框架教程 - 第一部分:基础入门
我将创建一个完整的教程项目,包含从基础到高级的所有内容。
一、教程内容概述规划
第一部分:Express基础概念
- Express是什么 :基于Node.js的Web应用框架
- 核心特性 :路由、中间件、模板引擎
- 安装和配置 :项目初始化、依赖管理
第二部分:核心原理
- HTTP协议基础 :请求/响应模型
- 中间件机制 :洋葱圈模型原理
- 路由系统 :路径匹配和参数处理
第三部分:实践应用
- RESTful API设计
- 用户认证和授权
- 错误处理和日志记录上面内容,会结合实例来了解。
二、构建Express框架教程实例 - 完整项目结构
我将为你创建一个完整的Express教程项目,包含从基础到高级的所有内容。
1. 项目配置文件 (package.json)
{
"name": "express-tutorial",
"version": "1.0.0",
"description": "Express框架从入门到精通教程",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": ["express", "tutorial", "nodejs", "backend"],
"author": "",
"license": "MIT",
"dependencies": {
"express": "^4.18.0",
"body-parser": "^1.20.0",
"cors": "^2.8.5"
},
"devDependencies": {
"nodemon": "^2.0.0"
}
}
2. 基础教程文件 (README.md)
# Express框架完整教程
## 目录结构
express-tutorial/
├── package.json # 项目配置
├── README.md # 教程文档
├── index.js # 主入口文件
├── basics/ # 基础教程
├── intermediate/ # 中级教程 ├── advanced/ # 高级教程
└── examples/
# 实践案例
## 学习路径
1. 基础篇 - Express核心概念
2. 中级篇 - 路由、中间件、模板引擎
3. 高级篇 - 数据库集成、认证、部署
4. 实践篇 - 完整项目案例
3. 主入口文件 (index.js)
const express = require('express');
const app = express();
const PORT = 3000;
// 基础中间件配置
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// 基础路由示例
app.get('/', (req, res) => {
res.json({
message: '欢迎来到Express教程!',
endpoints: [
'/basics - 基础教程',
'/intermediate - 中级教程',
'/advanced - 高级教程',
'/examples - 实践案例'
]
});
});
// 启动服务器
app.listen(PORT, () => {
console.log(`🚀 Express教程服务器运行在 http://localhost:${PORT}`);
console.log('📚 请按照以下路径学习:');
console.log(' /basics - Express基础概念');
console.log(' /intermediate - 中级功能');
console.log(' /advanced - 高级特性');
console.log(' /examples - 实践案例');
});
4. 基础教程目录结构 basics\01-hello-express.js
javascript
// 基础教程1: Hello Express
const express = require('express');
const app = express();
const PORT = 3001;
// 最简单的Express应用
app.get('/', (req, res) => {
res.send('👋 Hello Express!');
});
// 路由参数示例
app.get('/user/:name', (req, res) => {
res.send(`你好, ${req.params.name}!`);
});
// 查询参数示例
app.get('/search', (req, res) => {
const query = req.query.q || '未知';
res.send(`搜索关键词: ${query}`);
});
app.listen(PORT, () => {
console.log(`📖 基础教程1运行在 http://localhost:${PORT}`);
});
5. 中级教程文件 intermediate\01-middleware.js
// 中级教程1: 中间件详解
const express = require('express');
const app = express();
const PORT = 3002;
// 自定义中间件 - 日志记录
app.use((req, res, next) => {
console.log(`📝 ${new Date().toISOString()} - ${req.method} ${req.url}`);
next(); // 必须调用next()继续执行
});
// 自定义中间件 - 请求时间记录
app.use((req, res, next) => {
req.startTime = Date.now();
next();
});
// 路由级中间件
app.get('/api/users', (req, res, next) => {
console.log('用户API被访问');
next();
}, (req, res) => {
const responseTime = Date.now() - req.startTime;
res.json({
users: ['张三', '李四', '王五'],
responseTime: `${responseTime}ms`
});
});
// 错误处理中间件
app.use((err, req, res, next) => {
console.error('❌ 错误:', err);
res.status(500).json({ error: '服务器内部错误' });
});
app.listen(PORT, () => {
console.log(`📚 中级教程1运行在 http://localhost:${PORT}`);
});
6. 安装依赖和运行说明 INSTALL.md
# 安装和运行指南
## 1. 安装依赖
```bash
npm install
```
## 2. 运行基础教程
```bash
node basics/01-hello-express.js
```
## 3. 运行中级教程
```bash
node intermediate/01-middleware.js
```
## 4. 运行主服务器
```bash
npm start
# 或使用开发模式
npm run dev
```
## 学习建议
1. 按顺序学习每个教程文件
2. 修改代码并观察变化
3. 尝试添加新功能
4. 阅读Express官方文档
7.安装部署
请运行以下命令安装依赖:
cd e:\99mydata\traeplace\xstudy
npm install
执行结果参考:

💡运行提示说明:
当前项目存在semver库的安全漏洞,这是nodemon的依赖问题。解决方案:
临时解决方案(推荐)
npm audit fix --force》》》我执行了也没有用。。。。
长期解决方案
等待nodemon官方更新版本,或者在生产环境中使用node而不是nodemon
生产环境建议
使用PM2代替nodemon进行生产环境管理
定期运行
npm audit检查安全漏洞使用
npm update保持依赖最新
三、第一部分:开始基础概念学习
3.1 什么是Express
Express 的本质是基于 Node.js 原生 http 模块的轻量级封装框架 ,其核心原理围绕中间件机制 和路由系统展开,目的是简化 Web 服务器的开发。
Node.js 能做什么:
javascript
// 用Node.js原生写Web服务器(很麻烦)
const http = require('http');
const server = http.createServer((req, res) => {
// 要自己处理URL、方法、参数...
if (req.url === '/' && req.method === 'GET') {
res.end('Hello World');
}
// 每个功能都要自己写...
});
Express 能做什么:
javascript
// 用Express写同样的功能(很简单)
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});
// 一行代码搞定!
3.2 Express 原理(豆包提供)
3.2.1、核心定位:对 http 模块的封装与扩展
Express 并非从零实现 Web 服务,而是对 Node.js 内置的http模块进行了一层友好封装,同时补充了核心功能。
- 不是替代,而是增强 :Node.js 的
http.createServer()能创建基础服务器,但需要手动处理请求方法、路径匹配、响应头等,代码繁琐。Express 直接封装了该方法,通过express()创建的应用实例,本质是一个增强版的http服务器回调函数。 - 核心价值:通过中间件统一处理请求流程,通过路由系统简化 URL 与处理函数的映射,让开发者无需关注底层细节,专注业务逻辑。
3.2.2、灵魂:中间件(Middleware)机制
中间件是 Express 最核心的设计,所有请求的处理都依赖中间件的 "链式调用"。
1. 中间件的定义
中间件是一个函数,接收三个核心参数:
req:请求对象(由 Express 扩展,包含原生 http.IncomingMessage 的所有属性)。res:响应对象(由 Express 扩展,包含原生 http.ServerResponse 的所有属性)。next:函数,调用后会将请求传递给下一个中间件,若不调用则请求会被挂起。
2. 中间件的执行流程
请求从客户端发出后,会按中间件注册的顺序依次执行,形成 "请求处理链"。
- 客户端发送请求到服务器。
- Express 应用按
app.use()或路由注册的顺序,调用第一个中间件。 - 中间件处理逻辑(如日志记录、权限验证)后,调用
next(),将请求传递给下一个中间件。 - 直到某个中间件调用
res.send()、res.end()等方法发送响应,整个流程终止。
3. 中间件的分类
- 应用级中间件 :通过
app.use()注册,对所有请求生效(如全局日志、CORS 处理)。 - 路由级中间件 :通过
router.use()注册,仅对指定路由前缀的请求生效(如/api前缀的接口统一验证)。 - 错误处理中间件 :参数为
(err, req, res, next),专门捕获流程中的错误,需放在所有中间件最后。 - 内置 / 第三方中间件 :如
express.static()(处理静态资源)、express.json()(解析 JSON 请求体)。
3.2.3、核心功能:路由系统(Routing)
路由的作用是根据请求的 "HTTP 方法" 和 "URL 路径",匹配对应的处理函数,本质是 "请求地址与处理逻辑的映射规则"。
1. 路由的核心组成
一个完整的路由包含三部分:
- HTTP 方法 :如
GET、POST、PUT、DELETE。 - URL 路径 :如
/、/user、/user/:id(:id为动态参数)。 - 处理函数 :匹配成功后执行的逻辑,可接收
req、res、next。
2. 路由的匹配规则
- 按注册顺序匹配,先注册的路由优先生效。
- 支持精确匹配 (如
/user仅匹配/user)和模糊匹配 (如/user/:id匹配/user/1、/user/2)。 - 可通过
req.params获取动态路由参数(如/user/:id中,req.params.id即为路径中的id值)。
3. 路由的模块化
通过express.Router()创建路由实例,可将不同业务的路由拆分到单独文件(如userRouter、orderRouter),再通过app.use('/user', userRouter)挂载到主应用,实现代码解耦。
3.2.4、关键扩展:req 与 res 对象的增强
Express 对 Node.js 原生的req(请求)和res(响应)对象进行了扩展,增加了大量实用方法,简化开发:
- req 对象扩展 :
req.params:获取路由动态参数。req.query:获取 URL 查询参数(如?name=xxx)。req.body:获取请求体数据(需配合express.json()等中间件解析)。
- res 对象扩展 :
res.send():发送字符串、JSON 等响应(自动设置Content-Type)。res.json():专门发送 JSON 响应。res.status():设置响应状态码(如res.status(404).send('Not Found'))。res.redirect():重定向请求。
3.2.5、🎪 生动比喻:游乐园排队
Express应用 = 游乐园
- 入口:请求进来(游客买票入园)
- 安检:中间件检查(检查背包)
- 游乐项目:路由处理(玩过山车、旋转木马)
- 出口:响应返回(玩完回家)
🔄 完整流程演示
javascript
// 现实中的Express应用流程
const express = require('express');
const app = express();
// 第1关:日志记录(保安记录游客信息)
app.use((req, res, next) => {
console.log(`${new Date()} - ${req.method} ${req.url}`);
next(); // 放行到下一关
});
// 第2关:数据解析(检查游客证件)
app.use(express.json()); // 解析JSON数据
app.use(express.urlencoded({ extended: true })); // 解析表单数据
// 第3关:路由分发(指引游客去不同项目)
app.get('/rollercoaster', (req, res) => {
res.send('🎢 欢迎乘坐过山车!');
});
app.get('/ferriswheel', (req, res) => {
res.send('🎡 欢迎乘坐摩天轮!');
});
// 最终:启动游乐园
app.listen(3000, () => {
console.log('🎪 游乐园开门营业!');
});
四、Express基础概念详解 - 结合代码分析
我来结合 basics/01-hello-express.js 文件为你详细讲解Express基础概念。
第一部分:Express是什么
1. Express是什么:基于Node.js的Web应用框架
javascript
// 第1-3行代码解析
const express = require('express'); // 导入Express模块
const app = express(); // 创建Express应用实例
const PORT = 3001; // 设置端口号
详细解释:
- 框架 vs 库:框架提供完整结构,库提供具体功能
- 基于Node.js:Express建立在Node.js之上,扩展了HTTP处理能力
- 类比理解 :
- Node.js = 毛坯房(只有基本结构)
- Express = 精装修(提供完整功能)
2. 核心特性:路由、中间件、模板引擎
特性1:路由(Routing)
javascript
// 第6-8行:基础路由
app.get('/', (req, res) => {
res.send('👋 Hello Express!');
});
路由概念:
- URL映射:将网址映射到具体处理函数
- HTTP方法:GET、POST、PUT、DELETE等
- 路径匹配:精确匹配和模式匹配
特性2:中间件(Middleware) 虽然这个文件没有显式使用中间件,但Express本身就是基于中间件的:
- 请求处理管道:每个请求都经过一系列中间件
- 功能模块化:每个中间件负责特定功能
特性3:模板引擎 这个文件没有使用模板引擎,但Express支持:
- 动态HTML生成:EJS、Pug、Handlebars等
- 数据绑定:将数据渲染到HTML模板
3. 安装和配置:项目初始化、依赖管理
查看package.json中的配置:
javascript
{
"dependencies": {
"express": "^4.18.0",
"body-parser": "^1.20.0",
"cors": "^2.8.5"
}
}
第二部分:代码逐行深度解析
1. 导入和初始化
javascript
const express = require('express');
const app = express();
- require():Node.js的模块导入函数
- express():工厂函数,创建应用实例
- app:整个Web应用的核心对象
2. 路由系统详解
javascript
// 基础路由
app.get('/', (req, res) => {
res.send('👋 Hello Express!');
});
路由参数解析:
javascript
app.get('/user/:name', (req, res) => {
res.send(`你好, ${req.params.name}!`);
});
- :name:路由参数,从URL中提取值
- req.params.name:访问参数值
- 访问 /user/张三 → 显示"你好, 张三!"
查询参数解析:
javascript
app.get('/search', (req, res) => {
const query = req.query.q || '未知';
res.send(`搜索关键词: ${query}`);
});
- ?q=关键词:URL查询参数
- req.query.q:访问查询参数
- 访问 /search?q=Express → 显示"搜索关键词: Express"
3. 服务器启动
javascript
app.listen(PORT, () => {
console.log(`📖 基础教程1运行在 http://localhost:${PORT}`);
});
- app.listen():启动HTTP服务器
- 回调函数:服务器启动成功后执行
- 端口号:网络通信的"门牌号"
第三部分:核心概念扩展讲解
1. Express应用生命周期
javascript
1. 导入模块 → 2. 创建应用 → 3. 配置中间件 →
4. 定义路由 → 5. 启动服务器 → 6. 处理请求
2. 请求-响应模型
javascript
// (req, res) 参数详解
app.get('/path', (request, response) => {
// request: 包含客户端发送的所有信息
// response: 用于向客户端发送响应的工具
response.send('响应内容');
});
Request对象包含:
- req.params:路由参数
- req.query:查询参数
- req.body:请求体数据
- req.headers:请求头信息
Response对象方法:
- res.send():发送各种类型响应
- res.json():发送JSON数据
- res.render():渲染模板
- res.redirect():重定向
3. 项目结构理解
javascript
express-tutorial/
├── package.json # 项目配置和依赖
└── basics/ # 基础教程文件
└── 01-hello-express.js # 当前学习文件
第四部分:实践练习和测试
1. 运行当前教程
javascript
node basics/01-hello-express.js
2. 测试各个端点
- 首页测试 :访问 http://localhost:3001
- 用户页面测试 :访问 http://localhost:3001/user/李四
- 搜索测试 :访问 http://localhost:3001/search?q=Node.js
3. 代码修改练习
尝试修改代码:
javascript
// 修改欢迎消息
app.get('/', (req, res) => {
res.send('🎉 欢迎学习Express框架!');
});
// 添加新路由
app.get('/about', (req, res) => {
res.send('这是关于页面');
});
第五部分:学习要点总结
| 概念 | 代码示例 | 实际应用 |
|---|---|---|
| 框架导入 | const express = require('express') | 引入第三方库 |
| 应用创建 | const app = express() | 创建Web应用实例 |
| 路由定义 | app.get('/path', handler) | 处理特定URL请求 |
| 参数获取 | req.params.name, req.query.q | 从URL提取数据 |
| 响应发送 | res.send(), res.json() | 向客户端返回数据 |
| 服务器启动 | app.listen(port, callback) | 启动Web服务 |
第六部分:拓展练习
练习实例代码
basics\00-absolute-beginner.js
javascript
// 小白教程0: 绝对零基础入门
const express = require('express');
const app = express();
const PORT = 3000;
console.log('🎉 欢迎来到Express世界!');
console.log('================================');
// 第1步:理解什么是Express
console.log('📚 第1步:Express是什么?');
console.log('Express是一个基于Node.js的Web应用框架');
console.log('就像建房子需要脚手架一样,Express帮我们快速搭建Web应用');
console.log('');
// 第2步:创建最简单的服务器
console.log('🔧 第2步:创建服务器');
console.log('app.listen() 方法启动服务器');
console.log('PORT 是端口号,就像房子的门牌号');
app.get('/', (req, res) => {
console.log('🏠 有人访问了首页!');
res.send(`
<!DOCTYPE html>
<html>
<head>
<title>Express入门教程</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
.box { background: #f0f8ff; padding: 20px; border-radius: 10px; margin: 10px 0; }
.code { background: #2d2d2d; color: #f8f8f2; padding: 10px; border-radius: 5px; }
</style>
</head>
<body>
<h1>🎯 Express基础概念</h1>
<div class="box">
<h2>📖 什么是Express?</h2>
<p>Express是一个<strong>Web应用框架</strong>,基于Node.js构建</p>
<p>就像建房子的脚手架,帮我们快速搭建Web应用</p>
</div>
<div class="box">
<h2>🔧 核心概念</h2>
<ul>
<li><strong>路由(Routing)</strong>: 根据URL决定执行什么代码</li>
<li><strong>中间件(Middleware)</strong>: 请求处理管道</li>
<li><strong>请求(Request)</strong>: 客户端发送的信息</li>
<li><strong>响应(Response)</strong>: 服务器返回的信息</li>
</ul>
</div>
<div class="box">
<h2>🚀 试试这些链接:</h2>
<p><a href="/hello">/hello - 打招呼</a></p>
<p><a href="/about">/about - 关于我们</a></p>
<p><a href="/user/小明">/user/小明 - 用户页面</a></p>
</div>
</body>
</html>
`);
});
// 第3步:理解路由
console.log('');
console.log('🛣️ 第3步:路由是什么?');
console.log('路由就是根据不同的网址(URL)执行不同的代码');
app.get('/hello', (req, res) => {
console.log('👋 有人访问了/hello页面');
res.send(`
<h1>你好!👋</h1>
<p>这是你的第一个Express路由!</p>
<p><a href="/">返回首页</a></p>
<div class="code">
// 路由代码示例:<br>
app.get('/hello', (req, res) => {<br>
res.send('你好!');<br>
});
</div>
`);
});
app.get('/about', (req, res) => {
res.send(`
<h1>关于我们</h1>
<p>这是一个学习Express的教程项目</p>
<p><strong>路由参数说明:</strong></p>
<ul>
<li><strong>app.get()</strong> - 处理GET请求</li>
<li><strong>'/about'</strong> - 路由路径</li>
<li><strong>(req, res)</strong> - 请求和响应对象</li>
</ul>
<p><a href="/">返回首页</a></p>
`);
});
// 第4步:路由参数
console.log('');
console.log('🔗 第4步:路由参数');
console.log('路由参数让我们可以从URL中获取数据');
app.get('/user/:name', (req, res) => {
const userName = req.params.name;
console.log(`👤 用户 ${userName} 访问了页面`);
res.send(`
<h1>欢迎,${userName}!</h1>
<p>你刚刚使用了路由参数</p>
<p><strong>路由定义:</strong> /user/:name</p>
<p><strong>实际访问:</strong> /user/${userName}</p>
<p><strong>获取参数:</strong> req.params.name = "${userName}"</p>
<p><a href="/">返回首页</a></p>
`);
});
// 第5步:查询参数
app.get('/search', (req, res) => {
const keyword = req.query.q || '未指定';
console.log(`🔍 搜索关键词: ${keyword}`);
res.send(`
<h1>搜索结果</h1>
<p>搜索关键词: <strong>${keyword}</strong></p>
<p>试试在URL后面添加:?q=Express教程</p>
<p>例如:<a href="/search?q=Express教程">/search?q=Express教程</a></p>
<p><a href="/">返回首页</a></p>
`);
});
// 启动服务器
app.listen(PORT, () => {
console.log('');
console.log('🚀 服务器启动成功!');
console.log('================================');
console.log(`📖 教程运行在: http://localhost:${PORT}`);
console.log('');
console.log('💡 学习建议:');
console.log('1. 先访问首页了解基本概念');
console.log('2. 点击各个链接体验不同功能');
console.log('3. 观察终端输出的日志信息');
console.log('4. 尝试修改代码并重启服务器');
console.log('');
console.log('🎯 接下来学习:');
console.log('运行: node basics/01-hello-express.js');
});
运行
node basics/00-absolute-beginner.js
访问 http://localhost:3000 查看教程页面
动手实践练习
修改 basics/00-absolute-beginner.js 文件:
-
添加新路由:
app.get('/test', (req, res) => {
res.send('这是我的测试页面!');
}); -
重启服务器 :
按
Ctrl+C停止,然后重新运行node basics/00-absolute-beginner.js -
访问新页面 :