NestJS 是什么
本教程共 47 篇 · 第 1 篇 · 更新于 2026-08-09 · 约 8 分钟阅读
本节目标:搞清楚 NestJS 到底是干嘛的,它解决了什么问题,以及你该不该学它。
一句话介绍
NestJS 是一个用 TypeScript 构建的 Node.js 后端框架。
听着挺普通对吧?Node.js 后端框架多了去了,Express、Koa、Fastify……为什么还要再来一个?
因为前面这些框架解决的是”怎么接收请求、怎么返回响应”这种底层问题。但当你项目一大,你就会发现一个灵魂拷问:代码往哪放?
Express 不管这事。它给你一个最小骨架,剩下的架构全靠自己摸索。项目小的时候还行,等路由写到几百个、服务逻辑越来越复杂的时候,整个项目就变成了一个”什么都往 src 里塞”的垃圾场。
NestJS 就是来解决这个问题的。
NestJS 的核心思路
打个比方。Express 就像给你一堆砖头和水泥,你自己盖房子。盖个小平房没问题,但要盖一栋写字楼,你得自己设计图纸、承重结构、水电管线……
NestJS 则直接给了你一套标准化的建筑方案。哪里是承重墙、哪里走电线、哪里接水管,全都帮你规划好了。你只需要往里面填业务逻辑就行。
具体来说,NestJS 借鉴了 Angular 的架构设计,提供了一套开箱即用的组织方式:
- 模块(Module):把相关功能打包在一起,像文件夹一样管理代码
- 控制器(Controller):专门处理 HTTP 请求,决定”这个 URL 该调谁”
- 提供者(Provider):封装业务逻辑,干活的主力
- 依赖注入(DI):自动帮你管理对象之间的依赖关系
Note如果你用过 Angular,会发现 NestJS 的写法非常眼熟。装饰器、模块、依赖注入……几乎是同一套思路搬到了后端。没用过也不用慌,后面会一个一个讲。
装饰器:NestJS 的语法糖
NestJS 大量使用装饰器(Decorator)来标注代码。你可能在 TypeScript 或 Angular 里见过这种 @ 开头的语法:
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll(): string {
return '返回所有用户';
}
}
这段代码做了一件事:定义了一个处理 /users 路由的控制器,当收到 GET 请求时,调用 findAll 方法。
不用装饰器也能写后端,但装饰器的好处是——代码即文档。你一看 @Controller('users') 就知道这是个控制器,一看 @Get() 就知道它处理 GET 请求。不用翻来翻去找路由配置。
常用装饰器一览:
| 装饰器 | 作用 |
|---|---|
@Module() | 定义一个模块 |
@Controller() | 定义一个控制器 |
@Injectable() | 标记一个类可以被依赖注入管理 |
@Get() @Post() | 定义路由的 HTTP 方法 |
@Body() @Param() | 提取请求中的参数 |
这些装饰器后面都会详细讲,现在先混个脸熟。
NestJS 和 Express 的区别
很多人会问:我 Express 用得好好的,为什么要换 NestJS?
先看个对比:
| 对比项 | Express | NestJS |
|---|---|---|
| 架构 | 没有固定架构,自由组织 | 内置模块化架构 |
| TypeScript | 需要自己配置 | 原生支持 |
| 依赖注入 | 没有 | 内置 IoC 容器 |
| 学习曲线 | 低,上手快 | 相对高一些 |
| 适合场景 | 小项目、API 网关 | 中大型项目、微服务 |
简单说:
- Express 是”自由市场”,灵活但没有约束。项目小的时候很爽,大了容易乱。
- NestJS 是”规划好的小区”,有规矩但方便管理。一开始觉得约束多,项目一大就真香了。
TipNestJS 底层默认用的就是 Express。你也可以切换成 Fastify 来获得更好的性能。所以 NestJS 不是要替代 Express,而是在 Express 之上加了一层架构。
底层平台:Express 还是 Fastify
NestJS 有一个设计哲学叫”平台无关”。意思是 NestJS 本身不绑定某个 HTTP 框架,它通过适配器来对接不同的底层平台。
目前支持两个:
// 方式一:使用 Express(默认)
const app = await NestFactory.create(AppModule);
// 方式二:使用 Fastify(性能更好)
import { NestFactory } from '@nestjs/core';
import {
FastifyAdapter,
NestFastifyApplication,
} from '@nestjs/platform-fastify';
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
大部分情况下用默认的 Express 就行。等你需要极致性能的时候再考虑切 Fastify。
什么场景适合用 NestJS
说了这么多,到底什么时候该上 NestJS?
适合的场景:
- 团队多人协作,需要统一的代码组织规范
- 项目会持续增长,需要可维护的架构
- 要搞微服务架构
- 团队熟悉 TypeScript 或 Angular
不太适合的场景:
- 写个简单的 API 接口,几十行代码搞定
- 团队完全不会 TypeScript,短期也没打算学
- 对性能有极致要求(NestJS 的抽象层会带来一点点开销)
Note如果你的项目现在很小但未来可能变大,也建议直接用 NestJS。因为从 Express 迁移到 NestJS 的成本,比一开始就用 NestJS 高得多。
NestJS 的技术生态
NestJS 不只是一个框架,它背后有一整套官方维护的包来覆盖常见需求:
NestJS 生态
├── 核心
│ ├── @nestjs/core 核心引擎
│ ├── @nestjs/common 公共装饰器和工具
│ └── @nestjs/platform-* 平台适配器
├── 数据库
│ ├── @nestjs/typeorm TypeORM 集成
│ ├── @nestjs/mongoose MongoDB 集成
│ └── @nestjs/prisma Prisma 集成
├── 认证和安全
│ ├── @nestjs/passport Passport 认证集成
│ └── @nestjs/jwt JWT 支持
├── 微服务
│ └── @nestjs/microservices 微服务通信
├── 工具
│ ├── @nestjs/cli 命令行脚手架
│ └── @nestjs/testing 测试工具
└── 实时通信
└── @nestjs/websockets WebSocket 支持
这些包都是官方维护的,质量有保障。不像 Express 生态里需要自己在一堆第三方包里挑。
版本说明
本教程基于 NestJS 11.1.28 编写,要求 Node.js 版本 >= 20,TypeScript 5.x。
NestJS 的版本迭代比较稳定,10.x 和 11.x 的核心 API 差别不大。如果你用的是 10.x,大部分内容也适用。
小结
NestJS 做的事情就是:给 Node.js 后端开发提供一套标准化的架构方案。
它不是要取代 Express,而是在 Express 之上帮你把代码组织好。模块、控制器、服务、依赖注入……这些概念听起来多,但一个一个学其实很快。
接下来的教程会从安装环境开始,带你一步步搭建一个 NestJS 项目。