介绍
NestJS(简称 Nest)是一套基于 Node.js 的企业级后端开发框架,2017 年由 Kamil Myśliwiec 开源,核心基于 TypeScript 构建,同时兼容纯 JavaScript。
底层封装两大主流 Node HTTP 库:Express(默认)、Fastify(高性能替代)。
定位
解决原生 Express/Koa 无规范、代码混乱、难以大型团队协作的痛点;借鉴 Java Spring、Angular 的分层架构思想,提供标准化、模块化、可测试的后端开发体系,适合中大型服务、微服务、API 网关。
特点
- 强 TypeScript 原生支持:装饰器、依赖注入、类型校验、接口、泛型深度融合;
- 模块化分层架构:Module / Controller / Service 三层标准结构;
- 完整依赖注入(DI):解耦业务,单元测试零成本;
- 开箱即用中间件体系:拦截器、管道、过滤器、守卫;
- 多协议支持:HTTP API、WebSocket、GRPC、MQTT;
- 微服务原生内置:TCP、Redis、RabbitMQ、Kafka 多通信方案;
- 丰富生态:ORM(TypeORM/Prisma)、Swagger 文档、缓存、日志、定时任务;
- 跨平台:可打包为单文件、部署容器、Serverless。
架构分层
1. Module 模块(模块容器)
最小组织单元,类似 Spring 的 @Configuration,用来封装一组相关业务控制器、服务、依赖。
装饰器:@Module()
模块组成:
controllers:当前模块控制器providers:服务、工具类、依赖注入对象imports:导入其他模块(共享服务)exports:导出当前模块提供者,供外部模块使用
示例基础模块:
@Module({
controllers: [UserController],
providers: [UserService],
exports: [UserService] // 导出后其他模块可注入 UserService
})
export class UserModule {}
模块分类
- 根模块(AppModule):程序入口,唯一根模块;
- 功能模块:UserModule、OrderModule 业务模块;
- 共享模块(SharedModule):全局通用工具、过滤器、管道;
- 全局模块:
@Global()修饰,无需手动 import 全项目可用。
2. Controller 控制器(请求入口)
负责接收 HTTP 请求、路由分发、参数接收、返回响应,只做请求转发,不写业务逻辑。
装饰器:@Controller()、@Get()/@Post()/@Put()/@Delete()
职责边界:
- 获取请求参数(路径参数、query、body、header)
- 调用 Service 执行业务
- 统一返回结果
示例:
@Controller('user') // 路由前缀 /user
export class UserController {
constructor(private userService: UserService) {} // 注入服务
@Get(':id')
findOne(@Param('id') id: string) {
return this.userService.getById(+id);
}
}
3. Provider 提供者(业务逻辑层,核心是 Service)
所有可被 DI 注入的类都叫 Provider,最常用为 Service。
装饰器:@Injectable()
职责:纯业务逻辑、数据库操作、计算、第三方调用,控制器只调用服务,实现分层解耦。
@Injectable()
export class UserService {
getById(id: number) {
return { id, name: 'test' };
}
}
八大核心内置能力
1. 依赖注入 DI(框架灵魂)
作用
自动管理类实例生命周期,无需手动 new,实现低耦合、易单测。
注入规则
@Injectable()标记可注入类;- 构造函数声明依赖,框架自动实例化传入;
- 支持单例(默认全局单例)、请求级实例;
- 自定义注入 Token,可注入常量、工厂函数。
2. 中间件 Middleware
和 Express 中间件一致,在路由匹配前执行:日志、跨域、请求改写、token 初步校验。
两种写法:函数中间件 / Nest 类中间件(@Injectable() + implements NestMiddleware)
注册位置:AppModule 的 configure()。
3. 守卫 Guard(鉴权/权限控制)
在路由执行前拦截,判断是否允许访问接口,返回 true/false。
常用场景:登录校验、角色权限(admin/user)。
装饰器:@UseGuards()
内置:AuthGuard,配合 JWT 实现登录鉴权。
4. 管道 Pipe(参数校验 & 转换)
接收请求参数后、进入控制器前执行:
- 类型转换(string 转 number)
- 参数校验(必填、长度、正则)
主流配套:class-validator+class-transformer,全局统一校验 DTO。
5. 拦截器 Interceptor
请求前后双拦截:
- 请求前:修改入参、日志计时;
- 响应后:统一封装返回格式、异常捕获、缓存;
统一返回示例:{ code:200, data:xxx, msg:"success" }
6. 异常过滤器 ExceptionFilter
统一捕获全局/控制器/接口异常,格式化错误返回,避免原生 Express 杂乱报错。
内置 HttpException,可自定义业务异常(400、401、403、500)。
7. 装饰器 Decorator(元数据标记)
分为两类:
- 类装饰器:
@Module、@Controller、@Injectable; - 方法/参数装饰器:
@Get、@Param、@Body、@Query、@Roles(自定义权限);
支持自定义装饰器扩展业务标记。
8. DTO 数据传输对象
配合管道做请求体强类型校验,区分入参结构,避免 any 类型:
export class CreateUserDto {
@IsString()
@Length(2,10)
name: string;
@IsEmail()
email: string;
}
生命周期
请求完整执行流程
- 请求到达 → 全局中间件
- 路由中间件
- 守卫 Guard
- 拦截器(前置)
- 管道 Pipe 参数校验转换
- Controller 方法执行 → 调用 Service
- 拦截器(后置,封装返回)
- 异常过滤器(发生错误时触发)
微服务能力(Nest 一大优势)
Nest 原生支持微服务架构,一套代码切换多种传输协议:
- TCP(默认)
- Redis 发布订阅
- RabbitMQ / Kafka 消息队列
- GRPC 高性能二进制协议
- MQTT 物联网
微服务架构模式
- 单体拆分多微服务;
- API Gateway(Nest 网关)统一接收前端 HTTP,转发内部微服务;
- 服务间解耦通信,支持事件驱动。
常用配套生态
1. 数据库
- TypeORM:SQL 数据库(MySQL/PostgreSQL/SQLite)ORM
- Prisma:现代化类型安全 ORM(当下主流)
- Mongoose:MongoDB ODM
2. 文档
@nestjs/swagger:自动生成 OpenAPI / Swagger 接口文档,DTO、路由自动解析。
3. 安全
- JWT 登录鉴权:
@nestjs/jwt+ passport - Passport:多登录策略(账号密码、OAuth、Github)
- CORS、CSRF、请求限流
4. 工具
@nestjs/config:环境变量管理(.env 多环境区分 dev/prod)@nestjs/cache-manager:Redis 缓存@nestjs/schedule:定时任务 Cron- Winston / Pino:日志框架
- Fastify:替换 Express,性能提升 2~5 倍
项目标准目录结构
src/
├── main.ts # 程序入口,创建 Nest 应用
├── app.module.ts # 根模块
├── common/ # 公共通用层
│ ├── filters/ # 全局异常过滤器
│ ├── guards/ # 权限守卫
│ ├── interceptors/ # 统一响应拦截器
│ ├── pipes/ # 参数校验管道
│ └── decorators/ # 自定义装饰器
├── config/ # 配置文件、环境变量
├── modules/ # 业务模块(按业务拆分)
│ ├── user/
│ │ ├── dto/ # 请求DTO
│ │ ├── user.controller.ts
│ │ ├── user.service.ts
│ │ └── user.module.ts
│ └── order/
├── database/ # 数据库连接、实体、迁移
└── utils/ # 工具函数
优缺点
优点
- 强 TS 类型约束,大型项目可维护性极高;
- 架构规范统一,团队协作无代码风格混乱;
- 内置全套企业级能力,不用自己封装校验、鉴权、统一返回;
- 微服务、网关、RPC 原生支持,适合分布式系统;
- 装饰器语法清晰,学习过 Spring/Angular 上手极快;
- 丰富官方插件,生态成熟。
缺点
- 学习曲线高于 Express/Koa,新手需要理解 DI、装饰器、分层;
- 小型简单接口项目略显笨重;
- 编译阶段依赖 TS,开发启动速度略慢于原生 JS 框架;
- 相比 Go/SpringBoot,Node 底层并发性能上限更低。
适用场景
✅ 推荐使用:
- 中大型企业后台 API、管理系统;
- 微服务、分布式后端;
- 需要严格接口规范、自动文档、权限控制;
- 团队多人协作长期维护项目;
- 同时需要 HTTP + 消息队列 + GRPC 混合服务。
❌ 不推荐:
- 超简单轻量脚本、临时小接口;
- 极致追求极简、零依赖小型工具服务。
快速最小示例演示
1. 安装脚手架
npm i -g @nestjs/cli
nest new nest-demo
cd nest-demo
2. 生成 User 模块
nest g module user
nest g controller user
nest g service user
3. main.ts 入口
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
console.log('服务启动:http://localhost:3000');
}
bootstrap();
4. 完整请求链路
- AppModule 导入 UserModule;
- UserController 接收
/user请求; - 构造函数注入 UserService;
- Controller 调用 Service 获取数据返回;
- 全局拦截器统一包装返回格式。
和 Express / Koa / SpringBoot 对比
- vs Express/Koa
Express 是基础 http 库,无架构规范;Nest 基于 Express 封装完整分层、DI、微服务体系,开箱即用企业能力。 - vs SpringBoot
设计思想高度相似(DI、分层、注解);Spring 基于 Java,Nest 基于 Node+TS,前端开发者无缝衔接,前后端语言统一。