07
NestJS:企业级的 Node 框架
NestJS 10+ · 像 Spring Boot 的 Node 版
Express 灵活但自由过头——项目一上千行,代码怎么组织全靠自觉,十人团队能写出十种风格。NestJS 就是来"定规矩"的:它强制用 TypeScript,内置依赖注入、装饰器、模块化,整体设计思路几乎照抄 Spring Boot。如果你从 Java 转来,会觉得它亲切得像回家;如果纯 Node 背景,学会它就拿到了"写中大型企业项目"的门票。
五个核心概念:MVC + 依赖注入
| 概念 | 大白话 |
|---|---|
| Module(模块) | 把功能打包成一块,比如 UserModule、ArticleModule。一个大项目由很多 Module 拼成。 |
| Controller(控制器) | 负责"接请求"——哪个 URL 对应哪个函数,只做收发,不写业务。 |
| Service(服务) | 真正写业务逻辑的地方,被 Controller 调用。 |
| Provider / 依赖注入 | 你在构造函数里声明需要哪个 Service,Nest 自动把实例"递到你手上",不用自己 new。 |
| 装饰器 @ | 那些 @Module、@Get 就是贴标签,告诉 Nest"这个类/这个方法是干嘛的"。 |
一个最小 NestJS 控制器长这样(装饰器风格)
// cats.controller.ts
import { Controller, Get, Param, Post, Body } from "@nestjs/common";
import { CatsService } from "./cats.service";
@Controller("cats") // 这个控制器管 /cats 开头的路由
export class CatsController {
// 构造函数里声明需要 CatsService,Nest 自动注入实例
constructor(private readonly catsService: CatsService) {}
@Get() // GET /cats
findAll() {
return this.catsService.findAll();
}
@Get(":id") // GET /cats/123
findOne(@Param("id") id: string) {
return this.catsService.findOne(id);
}
@Post() // POST /cats,@Body 拿出请求体
create(@Body() body: { name: string }) {
return this.catsService.create(body);
}
}
除了 MVC,Nest 还有四把刀
- 守卫 Guard:进门查票。比如
@UseGuards(AuthGuard),没登录的请求直接挡在门外,进不了控制器。JWT 认证就靠它。 - 拦截器 Interceptor:在请求前后加工。比如统一给返回数据包一层
{code, data}格式,或记录耗时。 - 管道 Pipe:进门验货。配合 class-validator,自动校验前端传来的数据字段对不对(比如邮箱格式、年龄是不是数字),不对直接 400。
- 异常过滤器:统一处理报错,把未捕获的异常变成标准 JSON 错误响应,不用每处 try/catch。
选Express 还是 NestJS
小项目 / 练手 / 写个脚本和小接口:用 Express,轻、快、心智负担低。
中大型企业项目、团队协作、要长期维护:上 NestJS。它的"规矩"在小项目里是累赘,在大项目里是救命——依赖注入让单元测试好写,模块化让多人不打架,装饰器让结构一目了然。顺序建议:先 Express 摸透 Web 本质,再 NestJS 学生产级组织方式。
记
本章小结
① NestJS = TypeScript + 模块化 + 依赖注入 + 装饰器,是 Node 圈的"企业级标准答案"。
② 记住分工:Controller 接请求、Service 写业务、Module 打包;守卫管认证、管道管校验。
③ 从 Express 学起,项目大了再升级到 NestJS,别一上来就被装饰器吓退。