6月2日 01:30

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 之间通过 importsexports 通信,类似 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 做参数校验:

typescript
export 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 的架构开销不值得。

快速开始

bash
npm i -g @nestjs/cli nest new my-project cd my-project npm run start:dev

生成的项目结构:

shell
src/ ├── app.module.ts # 根模块 ├── app.controller.ts # 根控制器 ├── app.service.ts # 根服务 └── main.ts # 入口文件

添加模块:nest g module usersnest g controller usersnest g service users——CLI 自动创建文件并注册到 Module 里。

标签:NestJS