NestJS 是什么?和 Express 有什么区别?核心概念和应用场景
NestJS 是一个 Node.js 后端框架,底层用 Express(或 Fastify)做 HTTP 处理,上层加了模块化架构、依赖注入、装饰器语法。你可以把 NestJS 理解为 Node.js 版的 Spring Boot——同样的分层架构、同样的开箱即用。
NestJS vs Express
Express 是一个极简的 HTTP 路由库,给你一个 app.get() 然后自由发挥。项目小的时候很爽,项目大了没有约束——路由、中间件、数据库连接、业务逻辑全混在一起,没人知道代码应该放哪。
NestJS 解决的是"团队协作时的代码组织"问题:
- Module 划分功能边界(用户模块、订单模块、支付模块互不干扰)
- Controller 处理 HTTP 请求,只做参数校验和路由转发
- Service 处理业务逻辑,可以被多个 Controller 复用
- 依赖注入自动管理实例创建和依赖关系,不用手动 new 和传参
Express 5000 行代码以上的项目,不靠团队约定基本没法维护。NestJS 通过架构约束让你写出的代码天然就是分层的。
核心概念
Module(模块):组织代码的边界。每个功能模块有自己的 Controller、Service、Provider。Module 之间通过 imports 和 exports 通信,类似 JavaScript 的模块化但更严格——不 export 的东西外部不可见。
Controller(控制器):处理 HTTP 请求。用装饰器定义路由:
typescript@Controller('users') export class UsersController { @Get() findAll() { return this.usersService.findAll(); } @Post() create(@Body() dto: CreateUserDto) { return this.usersService.create(dto); } }
Service(服务):业务逻辑层。Controller 调 Service,Service 调数据库和外部 API。Service 用 @Injectable() 装饰,可以被依赖注入。
DTO(数据传输对象):定义请求/响应的数据结构,配合 class-validator 做参数校验:
typescriptexport class CreateUserDto { @IsEmail() email: string; @MinLength(8) password: string; }
NestJS 自动根据 DTO 校验请求参数,校验失败返回 400。
适合什么项目
- 中大型后端 API:用户系统、订单系统、管理后台——多模块、需要权限控制
- 微服务:NestJS 内置多种 Transport(Redis、RabbitMQ、Kafka、gRPC)
- GraphQL API:官方
@nestjs/graphql模块,代码优先(Code-First)定义 Schema - 实时应用:内置 WebSocket/Socket.IO 支持
不适合:简单的静态站点、只有一个接口的轻量服务——用 Express 或 Fastify 就够了,NestJS 的架构开销不值得。
快速开始
bashnpm i -g @nestjs/cli nest new my-project cd my-project npm run start:dev
生成的项目结构:
shellsrc/ ├── app.module.ts # 根模块 ├── app.controller.ts # 根控制器 ├── app.service.ts # 根服务 └── main.ts # 入口文件
添加模块:nest g module users、nest g controller users、nest g service users——CLI 自动创建文件并注册到 Module 里。