跳转到主要内容

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)

数据层(6–10)

认证与权限(11–12)

缓存与文档(13–14)

  • 第十三章:Redis — 浏览量计数、排行榜、缓存三难(穿透/击穿/雪崩)(learnhub RankingService + ZSET)
  • 第十四章:Swagger — 从代码自动生成可交互 API 文档(learnhub Swagger + DTO 装饰器)

部署与收尾(15、23)

实时与进阶中间件(16–22)

第十六章、第十七章是”借位”:文件名仍是 nginx/mini-project(URL 不变),内容已换成 GraphQL 和实时通信——因为 learnhub 这两块是重头功能却原本没有章节,而独立的 nginx 章和 mini-project 章在”learnhub 就是主角”的前提下显得多余(nginx 网关收进了第二十三章,mini-project 被 learnhub 本身取代)。

章节依赖

flowchart LR A["基础篇<br/>1 setup · 2 参数 · 3 IoC · 4 Module · 5 AOP"] --> B["数据层<br/>7 MySQL · 8 TypeORM · 9 关系 · 10 Prisma"] B --> C["认证权限<br/>11 JWT · 12 RBAC"] C --> D["服务与中间件<br/>6 上传 · 13 Redis · 14 Swagger · 18 Mongo<br/>19 MinIO · 20 RabbitMQ · 21 ES · 16 GraphQL · 17 实时 · 22 Etcd"] D --> E["收尾<br/>15 Docker · 23 完整闭环"]

基础篇是所有后续的依赖(DI、模块、AOP 在每章都用);数据层在认证之前(登录要查用户表);认证权限在所有”受保护接口”之前;中间件篇彼此相对独立、可跳读;最后用部署和闭环收口。

已有 Nest 基础怎么读

  • 只想看深度实现:直接跳第八章(TypeORM 事务/分页/迁移)、第十一章(双 token JWT)、第十三章(Redis 排行榜 + 缓存三难)、第二十一章(ES 真实 SearchService)。
  • 只想看架构:第一章 main.ts、第四章根模块装配、第五章 AOP 五件套、第二十三章九服务编排。
  • 想跑全栈:第十五章 + 第二十三章,docker compose up 一把起九个服务。