# nodejs-web-dev-course-code **Repository Path**: qzzzyyyyy/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**: 0 - **Forks**: 8 - **Created**: 2026-05-07 - **Last Updated**: 2026-05-07 ## 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 关系型数据库、MongoDB 文档型数据库、ORM/ODM 框架、连接池、事务 ``` chapter05/ ├── 01-mysql2/ ★ Part 1:MySQL + mysql2 驱动 │ ├── db.js 数据库连接池配置(复用连接) │ ├── 01-connect-db.js mysql2/promise 连接 + execute() │ ├── 02-search-books.js 参数化查询、LIKE 模糊搜索、LIMIT 分页 │ ├── 03-query-data.js INSERT 语句、insertId/affectedRows │ ├── 04-CRUD.js ★ BookDao 类:完整数据访问层实现 │ ├── 05-connection-pool.js 连接池详解:createPool / getConnection │ ├── 06-promise-data.js ★ BookService 类:Promise 风格服务层 │ ├── 07-async-data.js execute() vs query() 对比、SQL 注入防护 │ └── 08-ex-todo/ ★ 练习:Todo 数据访问层 │ ├── db.js 数据库连接 │ ├── todo_db.js CRUD 方法待补全(try/catch 异常处理) │ └── test.js 测试脚本(直接运行 node test.js) │ ├── 02-orm/ ★ Part 2:Sequelize ORM 框架 │ ├── db.js Sequelize 配置 + 全部模型定义 │ ├── 01-connect.js Sequelize 连接测试 │ ├── 02-define-model.js sequelize.define() 定义模型 + sync() │ ├── 03-extend-model.js 继承 Model 类定义(class Xxx extends Model) │ ├── 04-query.js 查询:findAll / findOne / findByPk + Op 运算符 │ ├── 05-create-update.js 创建:create / bulkCreate;更新:save / update │ ├── 06-delete-relation.js 关系配置:1:1(hasOne/belongsTo)、1:n(hasMany) │ ├── 07-relation-api.js 多对多(belongsToMany)+ 关联查询(include)+ 事务 │ └── 08-ex-todo/ ★ 练习:Todo Sequelize 版 │ ├── db.js Sequelize 配置 + Todo/User 模型 │ ├── todo_db.js CRUD 方法待补全 │ └── 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 详解:字段类型、验证器、$set/$inc 操作符 ├── 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 / findOneAndDelete └── 08-ex-todo/ ★ 练习:Todo Mongoose 版 ├── db.js MongoDB 连接 ├── todo_schema.js Todo Schema 待补全(添加验证规则) ├── user_schema.js User Schema ├── todo_db.js CRUD 方法待补全 └── test.js 测试脚本 ``` #### 环境准备 **MySQL(Part 1 & Part 2)** ```bash # 创建数据库 mysql -u root -p CREATE DATABASE nodejs_db; USE nodejs_db; # 创建表(Part 1 需要手动执行) CREATE TABLE IF NOT EXISTS books ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL, author VARCHAR(100), price DECIMAL(10,2), stock INT DEFAULT 0 ); ``` **MongoDB(Part 3)** ```bash # 确保 MongoDB 服务运行中 mongod --dbpath /data/db # 或使用 Docker docker run -d -p 27017:27017 --name mongodb mongo:latest ``` #### 运行方式 ```bash # Part 1:MySQL 基础 node chapter05/01-mysql2/01-connect-db.js node chapter05/01-mysql2/04-CRUD.js # 完整 CRUD 示例 node chapter05/01-mysql2/05-connection-pool.js # Part 2:Sequelize ORM node chapter05/02-orm/01-connect.js # 连接测试 node chapter05/02-orm/04-query.js # 查询示例 node chapter05/02-orm/07-relation-api.js # 关系 + 事务 # Part 3:MongoDB + Mongoose node chapter05/03-mongodb/02-mongoose-connect.js node chapter05/03-mongodb/05-book-query.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 ``` #### 核心概念对比 | 特性 | MySQL + mysql2 | Sequelize ORM | MongoDB + Mongoose | | ------------ | ------------------------- | ------------------------ | ------------------------ | | **类型** | 关系型数据库 | ORM 框架(封装 SQL) | 文档型数据库 | | **数据模型** | 表(Table) | Model 类 | Collection + Schema | | **主键** | AUTO_INCREMENT | id(自增/UUID) | _id(ObjectId) | | **查询语言** | SQL | 方法链(链式调用) | 方法链 + 聚合管道 | | **事务** | BEGIN/COMMIT/ROLLBACK | transaction() | session(4.0+ 支持) | | **连接池** | createPool() | 自动管理 | connect() 自动管理 | #### 练习要求 - **01-mysql2**:打开 `08-ex-todo/todo_db.js`,按 TODO 补全 CRUD 方法,注意异常处理 - **02-orm**:Sequelize 自动建表,只需补全 `08-ex-todo/todo_db.js` 中的查询逻辑 - **03-mongodb**:先补全 `todo_schema.js` 的验证规则,再完成 `todo_db.js` 的 CRUD #### 拓展: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 本仓库代码仅供课程学习使用,禁止商业转载。