卷目 · TOPIC
Nest 使用笔记
围绕 NestJS 后端框架、模块设计、依赖注入、接口开发和部署实践的长期整理。
-
Nest 全栈实操课程
围绕真实项目 learnhub(一个学习社区后端)的 NestJS 全栈实操课。23 章,每章打开 learnhub 的真实代码讲透一个子系统,最后用九服务 docker compose 把整套跑起来。
- Nest
- 全栈
- 实操
-
第一章:搭建并运行第一个 Nest 项目
装 Nest CLI、建项目、跑起开发服务看到 Hello World,再打开 learnhub 的真实 main.ts,看一个生产级 Nest 启动做了哪几件事——全局前缀、URI 版本化、参数校验、Swagger、日志。整门课的起点,也是后续每章要反复改的文件。
- Nest
- 入门
-
第二章:参数接收与校验——ValidationPipe、DTO 与自定义装饰器
打开 learnhub 的 main.ts 和真实 DTO,讲透全局 ValidationPipe 三个选项各自做什么、class-validator 怎么用、为什么 query 参数全是字符串、PageDto 计算属性为什么依赖 transform、自定义 @CurrentUser / @Public 装饰器的工作原理,以及为什么永远不该把 Entity 直接当 @Body 接收。每段代码都在 learnhub 里指得到文件。
- Nest
- 入门
- 校验
-
第三章:IoC 与依赖注入——为什么构造函数里写个类型就能直接用
打开 learnhub 的 PostService(7 个真实依赖)和 RedisModule(useFactory),在真实代码里讲透 IoC 容器怎么工作、provider 的四种形式、单例与 REQUEST scope 的取舍、为什么 ConfigService 能随处注入。每段代码都指向 learnhub 的真实文件。
- Nest
- IoC
- 入门
-
第四章:Module 进阶——动态、全局、生命周期与循环依赖
打开 learnhub 的真实 app.module.ts、PostModule、RedisModule、MinioModule,讲透 @Module 的四字段、forRootAsync/useFactory 的动态模块、@Global 的取舍、OnModuleInit/OnModuleDestroy 的优雅降级、循环依赖。每段代码都能在 learnhub 里指到对应文件。
- Nest
- Module
-
第五章:AOP 五件套——一次请求是怎么被层层处理的
打开 learnhub 的真实守卫、拦截器、过滤器,在 JWT 鉴权、统一响应、异常兜底这些生产代码里讲透 Middleware / Guard / Pipe / Interceptor / ExceptionFilter 的职责、执行顺序、注册顺序。learnhub 唯独没有 Middleware——这一章顺手补一个真实的 correlation-id 中间件,把最后一块拼图补上。
- Nest
- AOP
-
第六章:文件上传——multer 接收、大小类型限制、memoryStorage 转存 MinIO
打开 learnhub 的 UploadController,在真实代码里讲透 Nest 怎么用 multer 接 multipart/form-data:为什么用 memoryStorage 把文件全读进内存再流到 MinIO、limits + fileFilter 拦大文件和危险类型、Controller 和 MinioService 怎么分责。每段代码都能在 learnhub 里指到对应文件。第十九章再细讲 MinIO 和预签名直传。
- Nest
- 文件上传
- Multer
-
第七章:MySQL 基础——从 learnhub 的真实表结构读懂列类型、字符集、索引与外键
打开 learnhub 的 Init 迁移,从真实 CREATE TABLE 讲透 utf8mb4 字符集、自增主键、UNIQUE 索引、联合主键、外键,再到连接配置里 charset/timezone 的为什么。每个结论都在 learnhub 的 schema 里指得到,顺带说清什么时候该选 MySQL、什么时候该让位给 Mongo 或 Redis、为什么高并发系统反而会拆掉外键。
- MySQL
- SQL
- 数据层
-
第八章:TypeORM 集成——帖子服务的增删改查、分页、事务与迁移
打开 learnhub 的 PostService,在真实代码里讲透 TypeORM 的 Repository、QueryBuilder 分页、事务、404、所有权校验,以及生产必备的 migration 工作流。每段代码都能在 learnhub 里指到对应文件。
- Nest
- TypeORM
- 数据层
-
第九章:TypeORM 关系映射——三种基数、自关联、owning 与 inverse、N+1 与序列化
打开 learnhub 的 Post 实体,在一份真实代码里讲透三种关系基数(多对一 / 一对多 / 多对多)、Comment 自关联的嵌套回复、owning 与 inverse 怎么选、eager vs lazy 为什么几乎总该选 lazy、relations 对象 vs QueryBuilder 两种加载写法、N+1 怎么发现怎么治,以及关系字段在序列化里怎么处理。每段代码都能在 learnhub 里指到对应文件。
- Nest
- TypeORM
- 数据层
-
第十章:Prisma——schema-first 重写帖子服务,和 TypeORM 共存对照
在 learnhub 已接入 TypeORM 的基础上引入 Prisma:用 db pull 从已有库内省出 schema.prisma、PrismaService 全局注入、/api/v2/posts 和 v1 共用同一个 MySQL。每段代码都在 learnhub 里指到对应文件,最后给 TypeORM 和 Prisma 的诚实选型。
- Nest
- Prisma
- 数据层
-
第十一章:JWT 认证——双 token、无感刷新、Guard 衔接,以及 JWT 无状态的盲区
打开 learnhub 的 auth 模块,在真实代码里讲透 access + refresh 双 token、refresh 无感刷新、payload 该放什么、JwtAuthGuard 怎么消费 token;老实说 md5+salt 的弱点并给 bcrypt 升级路径,诚实讲清 JWT 登出/踢人下线为什么需要 Redis 黑名单或 token 版本号(learnhub 没实现,教你怎么补)。
- Nest
- 认证
- JWT
-
第十二章:RBAC 权限控制——三表模型、功能级与数据级权限、全局 Guard 链
在上一章登录的基础上加权限。打开 learnhub 的 RBAC 代码——role/permission 实体、user_role/role_permission 多对多、@RequirePermission 装饰器、全局 PermissionGuard、Seed 灌角色权限,再讲清功能级权限和数据级权限(assertAuthor)为什么是两道关,以及生产必备的权限缓存怎么补。
- Nest
- RBAC
- 认证
-
第十三章:Redis——浏览量计数、排行榜与缓存的三种用法
打开 learnhub 的 RankingService,在真实代码里讲透「浏览量走 Redis 不走 MySQL」的写法(INCR 增量 + 原子 getdel flush + Cron 刷库)、Sorted Set 日/月/年榜单(ZUNIONSTORE 把 12 个月榜合并成年榜),再补上 Redis 的
- Nest
- Redis
- 缓存
-
第十四章:Swagger——从代码自动生成可交互 API 文档
打开 learnhub 的 main.ts 和真实 controller/DTO,讲透 Swagger 的挂载、@Api*/@ApiProperty 装饰器、Bearer 鉴权联调、多版本分组、multipart 上传文档,以及 OpenAPI JSON 为什么不只是「一个文档页」。每段代码都能在 learnhub 里指到对应文件。
- Nest
- Swagger
-
第十五章:Docker 部署——多阶段镜像、entrypoint 迁移闸门、九服务 compose
打开 learnhub 的 Dockerfile / docker-entrypoint.sh / docker-compose.yml,在真实代码里讲透多阶段构建为什么这么分、迁移闸门为什么放在启动前、九服务拓扑为什么用一张 compose。每段代码都能在 learnhub 里指到对应文件。
- Nest
- Docker
- 部署
-
第十六章:GraphQL 分析看板——code-first、多数据源聚合
打开 learnhub 的 AnalyticsResolver,在真实代码里讲透 GraphQL 的 code-first schema、Apollo 驱动配置、Resolver/ObjectType 装饰器,以及如何用一个 GraphQL 查询聚合 MySQL 计数与 Mongo DAU。每段代码都能在 learnhub 里指到对应文件。
- Nest
- GraphQL
- 数据聚合
-
第十七章:实时通信——WebSocket 聊天室与 SSE
打开 learnhub 的 ChatGateway,在真实代码里讲透 WebSocket:socket.io 网关、连接时手验 JWT、房间广播、先存库再广播;再用一个 SSE 控制器对比「服务端单向推送」的轻量写法。每段代码都能在 learnhub 里指到对应文件。
- Nest
- WebSocket
- SSE
- 实时
-
第十八章:MongoDB——行为日志、全局埋点拦截器与 DAU 分析
打开 learnhub 的 BehaviorLogInterceptor,在真实代码里讲透为什么行为日志走 Mongo 而业务数据走 MySQL、Mongoose 在 Nest 里怎么集成、lazyConnection 为什么让启动容错、一个全局拦截器怎么把每个请求自动写进 Mongo 喂给 DAU 分析。每段代码都能在 learnhub 里指到对应文件。
- Nest
- MongoDB
- 数据层
-
第十九章:MinIO——对象存储、桶策略与预签名直传
打开 learnhub 的 MinioService,在真实代码里讲透 S3 兼容对象存储、桶自动建 + 匿名读策略、服务端代传和前端预签名直传两条上传通道,以及公开桶和签名 GET 各自的边界。每段代码都能在 learnhub 里指到对应文件。第六章讲过 multer 怎么接收,这一章讲它存哪里。
- Nest
- MinIO
- 对象存储
-
第二十章:RabbitMQ——把领域事件从主流程里剥出来,异步、可靠地投递
打开 learnhub 的 AmqpService,在真实代码里讲透消息队列的意义、RabbitMQ 的 Exchange/Queue/binding 模型、生产者的 fire-and-forget 模式,再补上 learnhub 没写的消费者——手动 ack、持久化、重投与死信队列(DLX)。每段代码都能在 learnhub 里指到对应文件。
- Nest
- RabbitMQ
- 消息队列
-
第二十一章:Elasticsearch——全文检索、中文分词与 MySQL→ES 双写同步
打开 learnhub 的 SearchService,在真实代码里讲透倒排索引为什么比 MySQL LIKE 快、IK 两个 analyzer 的分工、bool+should 标题加权 ×3 的搜索 DSL,以及 PostService 里「MySQL 是真相源、ES 是可重建副本」的 fire-and-forget 双写同步钩子。
- Nest
- Elasticsearch
- 全文检索
-
第二十二章:Etcd / Nacos——配置中心与服务发现
打开 learnhub 的 EtcdService,在真实代码里讲透配置中心为什么不只是 .env、Etcd 的 KV get/put + 优雅降级、watch 热更新、Etcd 和 @nestjs/config 怎么分层共存;再补上 learnhub 作为单体没做的另一半——Nacos 服务发现和 @nestjs/microservices。每段真实代码都能在 learnhub 里指到对应文件。
- Etcd
- Nacos
- 微服务
-
第二十三章:完整闭环——9 服务编排、Nginx 网关与上线清单
用一份 docker-compose 把 Nest + MySQL + Redis + MinIO + Mongo + RabbitMQ + Etcd + Elasticsearch + Nginx 同时拉起来,一条 docker compose up -d 让前 22 章每个中间件都在同一个网络里跑起来。然后逐个上游做冒烟巡检、谈优雅降级、给一份能上线的清单,并收尾整门课。
- Nest
- Docker
- 部署