# nodejs-web-dev-course-code **Repository Path**: leeworks/nodejs-web-dev-course-code ## Basic Information - **Project Name**: nodejs-web-dev-course-code - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 28 - **Created**: 2026-04-29 - **Last Updated**: 2026-05-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Node.js 后端应用开发 · 示例代码仓库 > 配套课程:**《Node.js 后端应用开发》** > 适用人群:有 JavaScript 基础、希望系统学习 Node.js 服务端开发的同学 --- ## 快速开始 ### 环境要求 | 工具 | 版本要求 | | ------- | --------------------------- | | Node.js | **≥ 18.x LTS**(推荐 20.x) | | npm | ≥ 9.x(随 Node.js 自带) | > 下载地址:[https://nodejs.org](https://nodejs.org) ### 克隆仓库 ```bash git clone git@gitee.com:leeworks/nodejs-web-dev-course-code.git cd nodejs-web-dev-course-code ``` ### 运行示例 大多数示例**无需安装依赖**,直接用 `node` 运行: ```bash node chapter01/00-simple-server.js ``` 有 `package.json` 的子目录需先安装依赖: ```bash cd chapter02/02-ESM npm install node index.js ``` --- ## 目录结构 ``` . ├── chapter01/ 第一章:Node.js 基础 ├── chapter02/ 第二章:模块系统与常用内置模块 ├── chapter03/ 第三章:文件、Buffer 与流 ├── chapter04/ 第四章:HTTP 模块与 RESTful 应用 ├── chapter05/ 第五章:数据库(MySQL + MongoDB) └── README.md ``` --- ## 各章详解 ### 第一章:Node.js 基础 > 核心主题:Node.js 运行时、事件系统、全局对象、定时器 ``` chapter01/ ├── 00-simple-server.js 最简 HTTP 服务器(5 行代码跑起第一个服务) ├── 01-event/ │ ├── 01-event-basic-demo.js EventEmitter 基础:on / emit / once / off │ └── 02-chatroom-demo.js 模拟聊天室:多用户事件广播综合案例 ├── 02-global-object/ │ └── 02-global-vars-and-path.js __dirname、__filename、process 等全局变量 └── 03-timer/ └── 01-timer.js setTimeout、setInterval、setImmediate 执行顺序 ``` **运行方式:** ```bash node chapter01/00-simple-server.js # 浏览器访问 http://localhost:3000 node chapter01/01-event/02-chatroom-demo.js ``` --- ### 第二章:模块系统与常用内置模块 > 核心主题:CommonJS、ES Modules、os / util / path / url / querystring 模块 ``` chapter02/ ├── 01-commonjs/ │ ├── math.js 导出工具函数(module.exports) │ └── index.js require 引入并使用 ├── 02-ESM/ │ ├── package.json "type": "module" 开启 ESM │ ├── math.js export 具名导出 │ └── index.js import 导入 ├── 03-os-module/ │ └── 01-os-demo.js 获取系统信息:平台、CPU、内存、网络接口 ├── 04-util-module/ │ └── 01-promisify.js util.promisify 将回调函数转为 Promise ├── 05-path-module/ │ ├── 01-path-join.js path.join 跨平台路径拼接 │ └── 02-path-parse.js path.parse / basename / extname ├── 06-url-module/ │ ├── 01-url-legacy.js 旧版 url.parse(了解即可) │ └── 02-url-whatwg.js 新版 WHATWG URL API(推荐) ├── 07-querystring-module/ │ ├── 01-qs-basic.js qs.stringify / qs.parse │ └── 02-url-with-qs.js URL 参数拼接与解析综合示例 ├── mymodule/ │ ├── hello.js 自定义模块示例 │ ├── bye.js │ └── index.js 模块入口聚合导出 └── npm-demo/ └── 01-lodash-demo.js lodash 常用工具函数演示(需 npm install) ``` **运行方式:** ```bash # CommonJS node chapter02/01-commonjs/index.js # ES Modules cd chapter02/02-ESM && node index.js # npm 示例(需先安装依赖) cd chapter02/npm-demo npm install node 01-lodash-demo.js ``` --- ### 第三章:文件、Buffer 与流 > 核心主题:fs 模块四种读写方式、Buffer 二进制操作、Stream 流、综合案例 ``` chapter03/ ├── 01-fs-module/ │ ├── files/ │ │ ├── file1.txt 读写测试文件 │ │ └── config.json 配置文件示例 │ ├── 01-rwfile-sync.js 同步读写(阻塞 I/O,适合脚本工具) │ ├── 02-rwfile-async.js 回调异步(展示回调嵌套问题) │ ├── 03-rwfile-promise.js Promise 链式调用(.then/.catch) │ ├── 04-rwfile-async-await.js async/await(推荐写法)★ │ ├── 05-rwfile-stream.js 流式读写 + pipe(适合大文件) │ └── 06-config-rw.js JSON 配置文件深度合并读写 ├── 02-buffer/ │ └── 01-buffer.js Buffer 创建、拼接、转换、与 Stream 的关系 ├── 03-stream/ │ ├── input.txt 流读取的测试文件 │ ├── 01-readable.js 可读流:highWaterMark 分块演示 │ ├── 02-writable.js 可写流:write / drain 事件 │ └── 03-pipe.js pipe 管道:流式复制文件 └── 04-note-cli/ ★ 综合案例:命令行笔记工具 ├── notes.json 笔记持久化数据(初始为空数组) ├── note.js 完整实现版本(参考代码) └── note-todo.js 练习版本(待补全 search、delete) ``` #### 综合案例:命令行笔记工具 综合运用 `fs.promises`、`JSON` 解析、命令行参数,实现一个持久化笔记工具。 **功能演示:** ```bash cd chapter03/04-note-cli # 添加笔记 node note.js add "今天学习了 fs 模块" node note.js add "Buffer 是处理二进制数据的核心类" node note.js add "Stream 流分块处理,适合大文件操作" # 查看所有笔记 node note.js list # 关键词搜索(支持高亮) node note.js search "fs" # 删除笔记(按 ID) node note.js delete 2 # 再次查看 node note.js list ``` **练习要求:**打开 `note-todo.js`,按照 TODO 注释完成: - **任务一**:实现 `searchNotes` 函数(关键词过滤) - **任务二**:实现 `deleteNote` 函数(按 ID 删除) - **任务三(进阶)**:将 `readNotes` 改为 Stream 流式读取 --- ### 第四章:HTTP 模块与 RESTful 应用 > 核心主题:http 模块、静态资源服务器、路由设计、RESTful API、Fetch 前后端联调 ``` chapter04/ ├── 01-http-basic/ │ ├── 01-hello-server.js 四步创建第一个 HTTP 服务端 │ ├── 02-response-headers.js Content-Type 三种类型对比(text/html/json) │ └── 03-url-and-redirect.js URL 解析 + 301/302 重定向 ├── 02-static-server/ │ ├── server.js 静态资源服务器(完整参考版) │ ├── server-todo.js ★ 练习版本(handleStatic() 函数体待补全) │ ├── package.json nodemon 热重载启动脚本 │ └── public/ │ ├── index.html 演示用 HTML 页面 │ ├── styles/main.css 演示用 CSS │ └── scripts/app.js 演示用前端 JS ├── 03-routing/ │ ├── 01-hardcode-router.js 硬编码路由(问题演示) │ ├── 02-configurable-router.js 可配置路由(改进方案) │ └── 03-params-and-body.js GET 查询参数解析 + POST body 读取 └── 04-calculator/ ★ 综合案例:在线计算器(前后端全链路) ├── server.js 服务端完整参考版 ├── server-todo.js 练习版本(handleCalcPost() 待补全) └── public/ ├── calculator.html 计算器前端页面 └── scripts/app.js Fetch 调用后端 API ``` **运行方式:** ```bash # 基础示例(无需安装依赖) node chapter04/01-http-basic/01-hello-server.js # 浏览器访问 http://localhost:3000 # 静态资源服务器(需先安装 nodemon) cd chapter04/02-static-server npm install npm start # 浏览器访问 http://localhost:3000 # 综合案例:在线计算器 node chapter04/04-calculator/server.js # 浏览器访问 http://localhost:3000/cal ``` #### **综合案例:静态服务端与 RESTful API** **练习要求:** - **02-static-server**:打开 `server-todo.js`,按 TODO 步骤补全 `handleStatic()` 函数 - 步骤 1:根据 `req.url` 拼出文件路径(`/` 映射为 `/index.html`) - 步骤 2:用 `path.extname()` 查表获取 `Content-Type` - 步骤 3:判断文件是否存在,存在则流式响应,否则返回 404 - **04-calculator**:打开 `server-todo.js`,按 TODO 步骤补全 `handleCalcPost()` 函数 - 步骤 1:异步读取请求体字符串 - 步骤 2:`JSON.parse` 解析并解构 `op1`、`op2`、`op` - 步骤 3:参数校验,缺失时返回 400 - 步骤 4:根据 `op` 执行四则运算(注意除零判断) - 步骤 5:返回统一格式 `{ status: 'ok', data: result }` --- ### 第五章:数据库(MySQL + MongoDB) > 核心主题:MySQL 关系型数据库、mysql2 驱动、Sequelize ORM、MongoDB + Mongoose ODM、连接池、事务、参数化查询 ``` chapter05/ ├── 01-mysql2/ ★ Part 1:mysql2 驱动与手写 SQL │ ├── db.js 连接池模块(复用配置) │ ├── bookinfo.sql 建库建表脚本与测试数据 │ ├── 01-connect-db.js mysql2/promise 连接 + execute() 基本查询 │ ├── 02-execute-vs-injection.js execute vs query 对比 + SQL 注入全过程演示 │ ├── 03-connection-pool.js 连接池配置、getConnection、并发压力测试 │ ├── 04-param-query.js 参数化查询:精确查询 / LIKE 模糊搜索 / LIMIT 分页 │ ├── 05-crud-BookDao.js BookDao 类:完整 CRUD 数据访问层 │ ├── 06-service-BookService.js BookService 类:图书借阅服务层(含借书/还书) │ ├── dao/ │ │ └── BookDao.js 独立 DAO 模块(供 Service 层复用) │ └── 08-ex-todo/ ★ 练习:Todo 数据访问层(mysql2 版) │ ├── db.js 数据库连接 │ ├── todo_db.js CRUD 方法待补全 │ ├── todo_db.solution.js 参考答案(教师用) │ └── test.js 测试脚本 │ ├── 02-orm/ ★ Part 2:Sequelize ORM 框架 │ ├── db.js Sequelize 连接模块 │ ├── 01-connect.js Sequelize 连接与 authenticate() 验证 │ ├── 02-define-model.js 模型定义:define() 声明式 vs 继承 Model 类 │ ├── 03-validate.js 模型验证器(内置 + 自定义) │ ├── 04-sync.js 数据库同步三种模式(sync / alter / force) │ ├── 05-query.js CRUD 操作 + Op 运算符体系 │ ├── 06-relations.js 关联关系:1:1 / 1:n / m:n 配置与查询 │ ├── 07-transaction.js 自动事务(声明式)vs 手动事务 │ ├── 08-raw-query.js 原生 SQL 查询(ORM 逃生舱) │ └── 08-ex-todo/ ★ 练习:Todo Sequelize 版 │ ├── db.js Sequelize 连接 │ ├── todo_db.js CRUD 方法待补全 │ ├── todo_db.solution.js 参考答案(教师用) │ └── test.js 测试脚本 │ ├── 03-mongodb/ ★ Part 3:MongoDB + Mongoose ODM │ ├── db.js MongoDB 连接配置 │ ├── 01-mongodb-native.js MongoDB 原生驱动 CRUD(了解底层) │ ├── 02-mongoose-connect.js Mongoose 连接测试 │ ├── 03-book-schema.js Schema 详解:字段类型、验证器 │ ├── 04-book-create.js 创建数据:create / save / insertMany │ ├── 05-book-query.js 查询:find / findOne / 分页排序 + 聚合管道 │ ├── 06-book-update.js 更新:updateOne / findOneAndUpdate │ ├── 07-book-delete.js 删除:deleteOne / deleteMany │ └── 08-ex-todo/ ★ 练习:Todo Mongoose 版 │ ├── db.js MongoDB 连接 │ ├── todo_schema.js Todo Schema 待补全(添加验证规则) │ ├── user_schema.js User Schema │ ├── todo_db.js CRUD 方法待补全 │ └── test.js 测试脚本 │ ├── 04-case-study/ ★ 综合案例:图书借阅管理系统 │ ├── database/ │ │ ├── mysql-schema.sql MySQL 建表脚本(4 张表 + 种子数据) │ │ └── mongodb-seed.js MongoDB 种子数据 │ ├── mysql2/ mysql2 原生 SQL 实现 │ │ ├── dao/ DAO 层(BookDao / BorrowDao / MemberDao) │ │ └── service/ LibraryService(含事务管理) │ ├── sequelize/ Sequelize ORM 实现 │ │ ├── models/ 模型定义(含关联关系) │ │ └── service/ LibraryService(声明式事务) │ ├── mongoose/ Mongoose ODM 实现 │ │ ├── models/ Schema 定义(引用 + populate) │ │ └── service/ LibraryService(session 事务) │ ├── test.js 统一测试脚本(三种实现) │ └── package.json 三方依赖 │ └── README.md 本文件 ``` #### 环境准备 **MySQL(Part 1 & Part 2 & Part 4)** ```bash # 创建课程数据库 mysql -u root -p # Part 1:使用 course_db(执行建表脚本) source chapter05/01-mysql2/bookinfo.sql USE course_db; # Part 2 & Part 4:使用 library_db CREATE DATABASE IF NOT EXISTS library_db; USE library_db; # 表结构由 Sequelize sync() 或 04-case-study/database/mysql-schema.sql 创建 ``` **MongoDB(Part 3 & Part 4)** ```bash # 确保 MongoDB 服务运行中 mongod --dbpath /data/db # 或使用 Docker docker run -d -p 27017:27017 --name mongodb mongo:latest ``` #### 运行方式 ```bash # Part 1:mysql2 手写 SQL node chapter05/01-mysql2/01-connect-db.js node chapter05/01-mysql2/02-execute-vs-injection.js # SQL 注入演示 node chapter05/01-mysql2/04-param-query.js # 参数化查询 node chapter05/01-mysql2/05-crud-BookDao.js # 完整 CRUD node chapter05/01-mysql2/06-service-BookService.js # 服务层(借书/还书) # Part 2:Sequelize ORM node chapter05/02-orm/01-connect.js # 连接测试 node chapter05/02-orm/05-query.js # CRUD + Op 运算符 node chapter05/02-orm/06-relations.js # 关联关系 node chapter05/02-orm/07-transaction.js # 事务 # Part 3:MongoDB + Mongoose node chapter05/03-mongodb/02-mongoose-connect.js node chapter05/03-mongodb/05-book-query.js # 查询 + 聚合管道 # Part 4:综合案例(三种实现对比) cd chapter05/04-case-study && node test.js # 练习题(每部分都有 test.js) node chapter05/01-mysql2/08-ex-todo/test.js node chapter05/02-orm/08-ex-todo/test.js node chapter05/03-mongodb/08-ex-todo/test.js ``` #### 三个 Part 的渐进关系 | 部分 | 方式 | 数据库 | 代码特征 | 事务 | |------|------|--------|---------|------| | Part 1 | 手写 SQL | MySQL | SQL 字符串 + DAO 层 | `beginTransaction()` 手动管理 | | Part 2 | ORM 封装 | MySQL | 模型定义 + 方法链 | `transaction()` 声明式 | | Part 3 | ODM 封装 | MongoDB | Schema + 聚合管道 | `startSession()` 手动管理 | | Part 4 | 三种方式对比 | MySQL + MongoDB | 同一业务三种实现 | 横向对比差异 | #### 练习要求 - **01-mysql2**:打开 `08-ex-todo/todo_db.js`,按 TODO 补全 CRUD 方法(使用 mysql2 execute + 参数化查询) - **02-orm**:打开 `08-ex-todo/todo_db.js`,用 Sequelize API 替换手写 SQL(`findAll`/`findByPk`/`create`/`update`/`destroy`) - **03-mongodb**:打开 `08-ex-todo/todo_db.js`,用 Mongoose 方法完成数据操作 #### 拓展:MySQL vs MongoDB 如何选型? | 场景 | 推荐 | |------|------| | 结构固定、关联查询多 | MySQL | | 表结构经常变动 | MongoDB | | 高并发写、数据量巨大 | MongoDB | | 强事务(转账、订单) | MySQL | | 日志、内容类非结构化数据 | MongoDB | --- ## 学习建议 1. **按章顺序学习**,每章代码配合对应课件 PPT 阅读效果更佳 2. **动手运行**每个示例,观察控制台输出,而不是只看代码 3. **遇到问题先看注释**,代码中有详细的执行说明和注意事项 4. **完成练习题**:每章末尾的 `*-todo.js` 文件是留给你动手的练习 5. 推荐搭配 [Node.js 官方文档](https://nodejs.org/docs/latest/api/) 查阅 API 细节 --- ## 常见问题 **Q: 运行报错 `Cannot use import statement outside a module`?** A: 该文件是 ES Module,需要确保目录下有 `"type": "module"` 的 `package.json`,或将文件后缀改为 `.mjs`。 **Q: `node_modules` 目录去哪了?** A: 本仓库示例代码大多数无需第三方依赖。需要安装依赖的子目录中有 `package.json`,进入该目录执行 `npm install` 即可。 **Q: `notes.json` 运行后被修改,怎么恢复初始状态?** A: 手动将文件内容改回 `[]` 即可,或执行: ```bash echo [] > chapter03/04-note-cli/notes.json ``` --- ## 课程资源 | 资源 | 地址 | | ---------------- | -------------------------------------------------------------------------------------------------------------- | | 课程 PPT | 课程平台下载 | | 示例代码仓库 | [https://gitee.com/leeworks/nodejs-web-dev-course-code](https://gitee.com/leeworks/nodejs-web-dev-course-code) | | Node.js 官方文档 | [https://nodejs.org/docs/latest/api/](https://nodejs.org/docs/latest/api/) | | npm 官网 | [https://www.npmjs.com](https://www.npmjs.com) | --- ## License 本仓库代码仅供课程学习使用,禁止商业转载。