
前言
之前我开了一个NestJS专栏专门更新Nest的文章,更新了10篇之后我发现有一个问题:这种系列的文章存在一个的局限性,不玩掘金的人就没办法看到了,而且文章方式不容易形成一种知识体系,它没有整体的知识体系目录,更重要的是,我需要一种更强的反馈机制或外部动力,驱使我不断进行Nest体系研究和分享,基于这样的一个契机,与清华大学出版社的编辑一拍即合,我决定了写一本关于NestJS全栈实践的技术图书。
寻求挑战
公司项目缺少挑战性
当入职上一个公司第二个月时,我发现业务发展并不是我想象的那样子,连续几个月我心里都觉得有点虚,也经常跟我老婆说目前我的工作现状是怎么样怎么样,主要原因是产品的迭代速度和技术要求跟我自身的薪酬不太匹配,有时候一个月就一两个需求,其余时间我只能不断通过做review+优化提效的工作来填补内心的落差感。她说你先静观其变呗!为此我也有了比较充裕的空闲时间。
外部寻求挑战
既然公司的项目无法带来很大的成长和挑战,我把机会转向了外部,决定去做一件自己没有尝试过的事情,由于之前都是通过文章、文档的形式来分享技术,于是与编辑沟通之后写一本技术图书,这件事情与平时写作不同的是它需要作者时刻提醒自己应该如何阐述一个技术观点,并且对话术、语义和格式都有行业要求,更重要的是,它需要有一个稳定的时间管理计划、输入输出计划,这无疑对我来说是一件有趣的事情。
适合人群及目录设计
针对这种比较新的Node服务端框架,市场上缺少的是基础入门部分的课程,所以面向人群是希望快速上手到实战的人群。设计出来的目录一共有四部分:Nest基础篇、Nest进阶篇、Nest扩展篇、Nest项目实战。每一部分都有能够最小运行的case来实操演示,在实际开发中遇到哪里不会的,直接去到对应章节下结合项目case回顾即可。
全局目录总览:
目 录
第1部分 基础篇
第1章 需要提前掌握的知识 2
1.1 Node中的请求与响应对象 2
1.1.1 原生Node处理HTTP请求 2
1.1.2 Express处理HTTP请求 4
1.1.3 Nest处理HTTP请求 7
1.2 TypeScript基础与应用 7
1.2.1 TypeScript编译 8
1.2.2 TypeScript类型系统 9
第2章 Nest初识 15
2.1 什么是Nest 15
2.1.1 Nest概述 15
2.1.2 Nest的主要特点 15
2.1.3 Nest的应用场景 16
2.2 快速上手Nest CLI 16
2.2.1 Nest CLI的安装 16
2.2.2 创建项目 17
2.2.3 生成指定的代码片段 19
2.2.4 构建应用 22
2.2.5 启动开发调试 24
2.2.6 查看项目信息 25
2.3 创建第一个Nest应用 25
2.3.1 生成后端项目 26
2.3.2 生成前端项目 26
2.3.3 准备工作 27
2.3.4 运行结果 29
2.3.5 模块化开发 30
2.4 Nest的AOP架构理念 32
2.4.1 MVC架构概述 32
2.4.2 AOP解决的问题 33
2.4.3 AOP在Nest中的应用 33
2.5 IoC思想解决了什么问题 40
2.5.1 IoC核心思想概述 40
2.5.2 IoC在Nest中的应用 41
2.6 学会调试Nest应用 44
2.6.1 Chrome DevTools调试 44
2.6.2 VS Code调试 46
2.6.3 扩展调试技巧 48
第3章 Nest核心概念介绍 51
3.1 贯穿全书的装饰器 51
3.1.1 基本概念 51
3.1.2 装饰器的种类 51
3.1.3 Nest中的装饰器 59
3.2 井然有序的模块化 60
3.2.1 基本概念 60
3.2.2 创建模块 61
3.2.3 共享模块 62
3.2.4 全局模块 64
3.2.5 动态模块 65
3.3 控制器与服务的默契配合 66
3.3.1 基本概念 66
3.3.2 Controller管理请求路由 67
3.3.3 Controller处理请求参数与请求体 68
3.3.4 Service处理数据层 70
3.3.5 服务与服务提供者 71
3.4 耳熟能详的中间件 71
3.4.1 类中间件 71
3.4.2 函数式中间件 74
3.4.3 局部中间件 74
3.4.4 全局中间件 74
3.5 拦截器与RxJS知多少 75
3.5.1 基本概念 75
3.5.2 创建项目 76
3.5.3 拦截器的基本使用方法 76
3.6 数据之源守护者:管道 79
3.6.1 基本概念 79
3.6.2 内置管道 80
3.6.3 自定义管道 88
3.7 Nest实现文件上传 89
3.7.1 初识Multer 89
3.7.2 单文件上传 91
3.7.3 多文件上传 94
3.7.4 上传任意文件 98
3.7.5 文件验证 99
第2部分 进阶篇
第4章 Nest与数据库 102
4.1 快速上手MySQL 102
4.1.1 安装和运行 102
4.1.2 MySQL的常用命令 105
4.1.3 可视化操作MySQL 107
4.2 MySQL表之间的关系 112
4.2.1 一对一关系 112
4.2.2 一对多/多对一关系 119
4.2.3 多对多关系 121
4.3 快速上手TypeORM 126
4.3.1 基本概念 126
4.3.2 项目准备 126
4.3.3 创建模型及实体 126
4.3.4 定义数据列及类型 127
4.3.5 连接数据库 128
4.3.6 使用Repository操作CRUD 129
4.3.7 使用QueryBuilder操作CRUD 131
4.4 使用TypeORM处理多表关系 134
4.4.1 一对一关系 134
4.4.2 一对多/多对一关系 140
4.4.3 多对多关系 142
4.5 在Nest中使用TypeORM操作MySQL 144
4.5.1 项目准备 144
4.5.2 使用EntityManager操作实体 147
4.5.3 使用Repository操作实体 148
4.5.4 使用QueryBuilder操作实体 151
第5章 性能优化之数据缓存 154
5.1 快速上手Redis 154
5.1.1 安装和运行 154
5.1.2 Redis的常用命令 155
5.2 在Nest中使用Redis缓存 162
5.2.1 项目准备 162
5.2.2 Redis初始化 164
5.2.3 建表并构建缓存 165
5.2.4 运行代码 167
5.2.5 设置缓存有效期 169
5.2.6 选择合理的有效期 170
第6章 身份验证与授权 171
6.1 Cookie、Session、Token、JWT、SSO详解 171
6.1.1 什么是身份验证 171
6.1.2 什么是授权 172
6.1.3 什么是凭证 172
6.1.4 什么是Cookie 172
6.1.5 什么是Session 173
6.1.6 Session与Cookie的区别 173
6.1.7 什么是Token 174
6.1.8 什么是JWT 176
6.1.9 JWT与Token的区别 177
6.1.10 什么是SSO 177
6.2 基于Passport和JWT实现身份验证 180
6.2.1 基本概念 181
6.2.2 项目准备 181
6.2.3 用本地策略实现用户登录 182
6.2.4 用JWT策略实现接口校验 184
6.2.5 代码优化 188
6.3 基于RBAC实现权限控制 191
6.3.1 基本概念 191
6.3.2 数据表设计 192
6.3.3 项目准备 193
6.3.4 创建实体 194
6.3.5 启动服务 196
6.3.6 实现角色守卫控制 196
6.3.7 生成测试数据 200
6.3.8 测试效果 202
第7章 系统部署与扩展 203
7.1 快速上手Docker 203
7.1.1 初识Docker 203
7.1.2 安装Docker 204
7.1.3 Docker的使用 205
7.2 快速上手Dockerfile 209
7.2.1 Docker的基本概念 209
7.2.2 Dockerfile的基本语法 210
7.2.3 Dockerfile实践 210
第3部分 扩展篇
第8章 单元测试与端到端测试 216
8.1 重新认识单元测试 216
8.1.1 什么是单元测试 216
8.1.2 为什么大部分公司没有进行单元测试 217
8.1.3 为什么要编写单元测试 217
8.1.4 先编写单元测试还是先编写代码 218
8.1.5 测试驱动开发 219
8.2 在Nest中使用Jest编写单元测试 220
8.2.1 初识Jest 220
8.2.2 项目准备 223
8.2.3 编写测试用例 224
8.2.4 实现业务代码 225
8.2.5 重构代码 229
8.3 集成测试 230
8.3.1 编写测试用例 230
8.3.2 测试效果 232
8.4 端到端测试 232
8.4.1 编写测试用例 233
8.4.2 实现业务代码 235
第9章 日志与错误处理 237
9.1 如何在Nest中记录日志 237
9.1.1 为什么要记录日志 238
9.1.2 内置日志器Logger 238
9.1.3 定制日志器 240
9.1.4 记录日志的正确姿势 241
9.1.5 第三方日志器Winston 241
9.2 Winston日志管理实践 241
9.2.1 Winston的基础使用 242
9.2.2 本地持久化日志 244
9.3 面向切面日志统计实践 248
9.3.1 中间件日志统计 248
9.3.2 拦截器日志统计 249
9.3.3 过滤器日志统计 251
第4部分 Nest项目实战篇
第10章 数字门店管理平台开发 254
10.1 产品需求分析与设计 254
10.1.1 产品需求说明 254
10.1.2 功能原型图 255
10.2 技术选型与项目准备 262
10.2.1 前端技术选型 262
10.2.2 初始化前端项目 262
10.2.3 前端架构设计 263
10.2.4 后端技术选型 264
10.2.5 初始化后端项目 265
10.2.6 后端架构设计 266
10.3 API接口及数据库表设计 268
10.3.1 API接口功能划分 268
10.3.2 数据库设计 269
10.4 实现注册登录 273
10.4.1 页面效果展示 273
10.4.2 接口实现 281
10.5 实现用户与角色模块 290
10.5.1 页面效果展示 290
10.5.2 表关系设计 295
10.5.3 接口实现 299
10.6 实现商品与订单模块 303
10.6.1 页面效果展示 304
10.6.2 表关系设计 306
10.6.3 接口实现 307
10.7 基于Redis实现商品热销榜 315
10.7.1 页面效果展示 316
10.7.2 接口实现 317
10.8 实现活动模块与定时任务 320
10.8.1 页面效果展示 320
10.8.2 表关系设计 322
10.8.3 接口实现 323
10.9 使用Docker Compose部署项目 325
10.9.1 编写后端Docker Compose文件 325
10.9.2 编写Dockerfile文件 330
完结语:是终点,更是新的起点 334
一个小小的决定 334
时间的杠杆 334
结语 334
整套知识体系下来,足以让你入门后端的知识体系,我也是靠着Nest的经验收获美图全栈offer一枚。
困扰我的是:地铁无座!
地铁🚇无座是一件让我很头疼的事情,因为我每天的通勤时间是3个小时,这是我一天中不容忽视可以用来构思文章和写作的充裕时间,所以有个座位空间就让我能够忘却回家路途中煎熬的等待过程,重要的是还能赶稿子,可谓是两全其美!!!
很多时候,我总是盯紧那么一两个人,待其起身就是我pigu坐上去之时,当然还有一种容错方案,就是我老婆买了个小凳子,让我在角落里也能有容身之处。。。

这时候,有人可能会说,有必要这么卷么?
对此我想说:我不知道什么是卷,我只是想把失去的时间找回来...
篇已成书
截止至今,我按照计划顺利交稿了,总共历时7个月,接下来还需要进行不断循环审核->修稿->审核,最后还有封面设计、确认终稿、印刷过程。
目前已经入职了新公司,我的mentor也给了新的学习课程,同时组内的技术栈用的是React + Next + Nest,接下来开启新的一段旅程,希望沉淀自己同时将更多业务应用中的Nest经验分享出来。
另外编辑在审查稿过程中给予了初稿高质量的评价,希望我继续构思下一篇图书!emmmm,这无疑是需要更多的时间投入,我期望故事还会继续~
