Nest 使用笔记
Nest 全栈实操课程
围绕真实项目 learnhub(一个学习社区后端)的 NestJS 全栈实操课。23 章,每章打开 learnhub 的真实代码讲透一个子系统,最后用九服务 docker compose 把整套跑起来。
- Nest
- 全栈
- 实操
这门课不讲零散知识点,而是围绕一个真实在跑的项目 learnhub(一个学习社区后端:用户、帖子、评论、标签、权限、搜索、聊天、排行榜)展开。learnhub 用 NestJS 10 + TypeScript 写成,3700+ 行、18 个模块、九服务 docker compose,几乎每一章要讲的功能它都已经真实实现了——所以每一章都是打开 learnhub 的真实代码、把它讲透,而不是写一遍一次性 demo。
每一章的代码都能在 learnhub/src/... 里指到对应文件;学完一章,learnhub 就长出一块;学完最后一章,docker compose up 把九个服务一起跑起来。
课程导读
这门课适合谁
- 会一点前端(JS/TS),想往全栈走、补齐后端的人。
- 后端零基础、想用 NestJS 系统学一遍”接口 → 数据库 → 登录权限 → 缓存 → 搜索 → 部署”完整链路的人。
- 已经在写 NestJS、但概念零散、想理清 IoC/AOP/分层的人。
后端没有”唯一正确”的语言。如果你已经在学 Python,Flask/Django/FastAPI 入门很快;如果目标是国内企业后端就业,Java + Spring Boot 生态最广;如果你会前端、想走全栈,Node.js + TypeScript + NestJS 是学习成本最低、又能接触企业级工程结构的选择——这就是这门课的路线。
NestJS vs Express vs Fastify
这三者不在一个层级:Express/Fastify 是底层 Web 框架(路由、请求、中间件);NestJS 是更上层的应用框架,提供模块、控制器、服务、依赖注入、装饰器、工程结构,底层默认就是 Express(也能切 Fastify)。Express 灵活但项目大了容易乱;Fastify 性能好、重 schema;NestJS 工程化强、适合中大型项目和团队协作,代价是学习曲线更陡(要懂装饰器、模块、依赖注入)。这门课选 NestJS。
NestJS 的三大心智模型
Nest 的名词(Module、Provider、Guard、Interceptor、Pipe、Filter)不要零散记,按 3 个模型 摆放,位置就清楚了。这三个模型分别在第三章、第五章、和贯穿全课展开。
一、IoC 容器模型:对象由谁创建、谁管理?
IoC(控制反转)解决的是:项目里一堆对象(UserService、AuthService、Repository…)不该到处手动 new,而应交给容器统一创建、组装。在 Nest 里——你只声明需要什么,容器负责 new 和注入。IoC 是思想,DI(依赖注入)是手段,Provider 是被管理的对象,Module 是组织容器的单位,Decorator 告诉框架一个类是什么角色。→ 第三章。
二、AOP 请求链路模型:一次请求经过哪些切面?
日志、鉴权、参数校验、统一响应、异常处理这些逻辑不该散在每个业务函数里,Nest 把它们抽成 5 种横切机制:
| 机制 | 解决的问题 |
|---|---|
| Middleware | 路由匹配前后的预处理(CORS、日志、链路 ID) |
| Guard | 请求能不能继续(登录校验、角色权限) |
| Interceptor | 包裹 Controller 前后(统一响应、耗时、缓存) |
| Pipe | 参数校验与转换(DTO 校验) |
| Exception Filter | 统一异常处理(错误码、错误消息) |
正常链路:请求 → Middleware → Guard → Interceptor(前) → Pipe → Controller → Service → Interceptor(后) → 响应;抛异常时走 Exception Filter。→ 第五章。
三、业务分层模型:代码写在哪一层?
| 层 | 文件 | 职责 |
|---|---|---|
| Controller 接口层 | *.controller.ts | 接请求、读参数、返回结果 |
| Service 业务层 | *.service.ts | 业务规则 |
| Repository/ORM 数据层 | TypeORM/Prisma | 操作数据库 |
| DTO 数据结构层 | *.dto.ts | 请求体/响应体/校验结构 |
| Entity 数据模型层 | *.entity.ts | 数据库表映射 |
原则:Controller 不写复杂业务,Service 不关心 HTTP 细节,数据库操作不散落在 Controller。→ 贯穿全课。
一句话:Nest 用 IoC 管对象,用 AOP 管请求横切,用 Controller/Service/Repository 管业务分层。
存储选型速查
learnhub 是多存储(polyglot)项目,每一章会用到其中一个。先有个全局印象:
| 场景 | 选什么 | learnhub 里干啥 |
|---|---|---|
| 关系型业务核心(用户/帖子/权限) | MySQL(或 PostgreSQL) | 主数据源,事务、外键、强一致 |
| 高频写、追加型日志 | MongoDB | 行为日志(每次请求记一条) |
| 缓存、计数、排行榜 | Redis | 浏览量计数、日/月/年榜 |
| 全文检索(中文分词、排序) | Elasticsearch | 帖子搜索(MySQL 的 LIKE 扛不住) |
| 文件/图片 | MinIO(S3 兼容对象存储) | 头像、附件 |
| 异步事件、解耦削峰 | RabbitMQ | 「帖子发布」等领域事件 |
| 动态配置、服务发现 | Etcd / Nacos | 运行时可改的配置 |
每个选型的”为什么”在对应章节展开,这里只是地图。
怎么把 learnhub 跑起来
git clone <learnhub 仓库> learnhub
cd learnhub
cp .env.example .env
# 最小起栈:MySQL + Redis(其它服务按章节需要再起)
docker compose -f docker/docker-compose.yml up -d mysql redis
npm install
npm run migration:run # 建表 + 灌种子(admin/admin123456)
npm run start:dev # http://localhost:3000/api/doc 是 Swagger
学到哪一章,就把对应服务加进 docker compose up -d(比如第十八章加 mongo、第二十一章加 elasticsearch)。最后第二十三章把九个服务全起。每章只读 learnhub 代码的话,不用全起。
课程地图(23 章)
每章一行:讲什么 → 打开 learnhub 的哪个模块。建议按顺序学;前后有依赖(比如第十一章 JWT 在第十二章 RBAC 之前)。
基础篇(1–5)
- 第一章:搭建并运行第一个 Nest 项目 — nest new / start:dev,再打开 learnhub 的
main.ts看生产级启动的五件事 - 第二章:参数接收与校验 — ValidationPipe 三选项、class-validator、DTO 与自定义装饰器(learnhub 的
CreatePostDto/PageDto) - 第三章:IoC 与依赖注入 — 声明依赖、容器注入、provider 作用域与 useFactory(learnhub
PostService的七个依赖) - 第四章:Module 进阶 — 动态模块 forRootAsync、@Global、生命周期、循环依赖(learnhub 根模块装配)
- 第五章:AOP 五件套 — Middleware/Guard/Pipe/Interceptor/Filter 的职责与执行顺序(learnhub 真实守卫/拦截器/过滤器,补一个中间件)
数据层(6–10)
- 第六章:文件上传 — multer 接收、大小/类型限制、memoryStorage 转存(learnhub 上传控制器)
- 第七章:MySQL 基础 — 从 learnhub 的真实建表读懂列类型、字符集、索引、外键
- 第八章:TypeORM 集成 — 帖子的增删改查、分页、事务、404、所有权、迁移(learnhub
PostService+data-source.ts) - 第九章:TypeORM 关系映射 — 三种基数、自关联评论树、owning/inverse、N+1(learnhub
Post实体) - 第十章:Prisma — schema-first 重写帖子服务,和 TypeORM v1 共存对照(learnhub Prisma v2)
认证与权限(11–12)
- 第十一章:JWT 认证 — 双 token、无感刷新、Guard 衔接,JWT 无状态的盲区与黑名单(learnhub
AuthService) - 第十二章:RBAC 权限控制 — 三表模型、功能级 vs 数据级权限、全局 Guard 链(learnhub
PermissionGuard+ Seed)
缓存与文档(13–14)
- 第十三章:Redis — 浏览量计数、排行榜、缓存三难(穿透/击穿/雪崩)(learnhub
RankingService+ ZSET) - 第十四章:Swagger — 从代码自动生成可交互 API 文档(learnhub Swagger + DTO 装饰器)
部署与收尾(15、23)
- 第十五章:Docker 部署 — 多阶段镜像、entrypoint 迁移闸门、九服务 compose(learnhub
Dockerfile+docker-compose.yml) - 第二十三章:完整闭环 — 九服务编排、Nginx 网关、上线清单(learnhub 全栈 compose +
nginx.conf)
实时与进阶中间件(16–22)
- 第十六章:GraphQL 分析看板 — code-first、多数据源聚合(learnhub
AnalyticsResolver;原 nginx 网关内容已并入第二十三章) - 第十七章:实时通信 — WebSocket 聊天室与 SSE、WS 鉴权(learnhub
ChatGateway;原 mini-project 已被 learnhub 本身取代) - 第十八章:MongoDB — 行为日志、全局埋点拦截器、DAU 分析(learnhub
BehaviorLog) - 第十九章:MinIO — 对象存储、桶策略、预签名直传(learnhub
MinioService) - 第二十章:RabbitMQ — 领域事件异步可靠投递、消费者、DLX(learnhub
AmqpService+ 消费者补充) - 第二十一章:Elasticsearch — 全文检索、中文分词、MySQL→ES 双写同步(learnhub
SearchService真实实现) - 第二十二章:Etcd / Nacos — 配置中心与服务发现(learnhub
EtcdService+ Nacos/microservices 补充)
第十六章、第十七章是”借位”:文件名仍是
nginx/mini-project(URL 不变),内容已换成 GraphQL 和实时通信——因为 learnhub 这两块是重头功能却原本没有章节,而独立的 nginx 章和 mini-project 章在”learnhub 就是主角”的前提下显得多余(nginx 网关收进了第二十三章,mini-project 被 learnhub 本身取代)。
章节依赖
基础篇是所有后续的依赖(DI、模块、AOP 在每章都用);数据层在认证之前(登录要查用户表);认证权限在所有”受保护接口”之前;中间件篇彼此相对独立、可跳读;最后用部署和闭环收口。
已有 Nest 基础怎么读
- 只想看深度实现:直接跳第八章(TypeORM 事务/分页/迁移)、第十一章(双 token JWT)、第十三章(Redis 排行榜 + 缓存三难)、第二十一章(ES 真实 SearchService)。
- 只想看架构:第一章
main.ts、第四章根模块装配、第五章 AOP 五件套、第二十三章九服务编排。 - 想跑全栈:第十五章 + 第二十三章,
docker compose up一把起九个服务。