如果说 Express 是 Node.js 的"轻骑兵",那么 NestJS 就是 Node.js 的"正规军"。它把后端开发带入了"工程化"的时代。
NestJS 是什么?#
NestJS 是 Kamil Myśliwiec 于 2017 年创建的 Node.js 企业级框架。它的核心特点是:借鉴 Angular 的架构思想,用 TypeScript 构建可扩展的 Node.js 应用。
类比理解#
| 对比项 | Express | NestJS |
|---|---|---|
| 架构 | 自由散漫 | 模块化系统 |
| 类型 | JavaScript 为主 | TypeScript 优先 |
| 依赖注入 | 无 | 完整支持 |
| 装饰器 | 无 | 广泛使用 |
| 就像 | 毛坯房 | 精装修房 |
NestJS = Angular 的架构 + Express/Express 的灵活 + TypeScript 的类型安全
核心特性#
1. 模块化架构:像拼图一样构建#
NestJS 的核心是模块系统:
// user.module.ts
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}// app.module.ts
@Module({
imports: [
UserModule,
AuthModule,
ConfigModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}2. 依赖注入:控制反转#
NestJS 实现了完整的依赖注入(DI)系统:
// user.service.ts
@Injectable()
export class UserService {
constructor(
private readonly userRepository: UserRepository,
private readonly logger: Logger,
) {}
async findAll(): Promise<User[]> {
return this.userRepository.find();
}
async create(createUserDto: CreateUserDto): Promise<User> {
const user = this.userRepository.create(createUserDto);
return this.userRepository.save(user);
}
}// user.controller.ts
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get()
async findAll(): Promise<User[]> {
return this.userService.findAll();
}
@Post()
async create(@Body() createUserDto: CreateUserDto): Promise<User> {
return this.userService.create(createUserDto);
}
@Get(':id')
async findOne(@Param('id') id: string): Promise<User> {
return this.userService.findOne(id);
}
}3. 装饰器路由:声明式定义#
NestJS 使用装饰器定义路由,清晰直观:
@Controller('api')
export class AppController {
@Get('hello')
getHello(): string {
return 'Hello World!';
}
@Post('users')
@UseGuards(AuthGuard)
@HttpCode(201)
async create(@Body() createDto: CreateDto, @Req() req: Request) {
return this.service.create(createDto, req.user);
}
@Get('users/:id')
@UseGuards(AuthGuard)
async findOne(@Param('id', ParseIntPipe) id: number) {
return this.service.findOne(id);
}
}4. 守卫、拦截器、管道:增强功能#
守卫(Guard):权限控制#
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
return request.headers.authorization?.startsWith('Bearer ');
}
}管道(Pipe):数据转换和验证#
@Injectable()
export class ValidationPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
if (metadata.type === 'body') {
// 验证逻辑
}
return value;
}
}拦截器(Interceptor):统一处理#
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const now = Date.now();
return next
.handle()
.pipe(
tap(() => console.log(`After... ${Date.now() - now}ms`)),
);
}
}5. 装饰器详解#
NestJS 大量使用装饰器:
| 装饰器 | 作用 |
|---|---|
@Controller() | 定义控制器 |
@Injectable() | 定义可注入服务 |
@Module() | 定义模块 |
@Get(), @Post() 等 | 定义路由方法 |
@Body(), @Param() 等 | 获取请求数据 |
@UseGuards() | 使用守卫 |
@UseInterceptors() | 使用拦截器 |
@UsePipes() | 使用管道 |
6. 数据库集成#
NestJS 可以集成多种数据库:
// 使用 TypeORM
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'test',
entities: [User],
synchronize: true,
}),
TypeOrmModule.forFeature([User]),
],
})
export class AppModule {}为什么 NestJS 如此流行?#
1. 企业级架构#
NestJS 提供了完整的工程化架构:
- 模块化系统
- 依赖注入
- 清晰的代码组织
- 适合大型项目
2. TypeScript 优先#
完全基于 TypeScript:
- 完整的类型支持
- 更好的代码提示
- 编译时错误检查
3. 丰富的生态#
- 数据库:TypeORM、Prisma、Mongoose
- 验证:class-validator
- 文档:Swagger/OpenAPI
- 测试:Jest
- WebSocket:Socket.io
4. 类似于 Angular#
如果你熟悉 Angular,学习 NestJS 非常容易:
- 相同的模块系统
- 相同的依赖注入
- 相同的装饰器风格
适用场景#
| 场景 | 适合程度 | 说明 |
|---|---|---|
| 企业级后端 | ⭐⭐⭐⭐⭐ | 完整架构支持 |
| 微服务 | ⭐⭐⭐⭐⭐ | 内置微服务支持 |
| REST API | ⭐⭐⭐⭐⭐ | 完整解决方案 |
| 大型应用 | ⭐⭐⭐⭐⭐ | 模块化架构 |
| TypeScript 项目 | ⭐⭐⭐⭐⭐ | 原生支持 |
| 简单工具 | ⭐⭐ | 有点"重" |
学习路线建议#
入门阶段(2 周)#
- 掌握 TypeScript
- 理解 NestJS 项目结构
- 学会模块、控制器、服务的基本用法
- 掌握依赖注入
进阶阶段(2-3 周)#
- 掌握守卫、拦截器、管道
- 学会数据库集成(TypeORM/Prisma)
- 掌握验证和异常处理
- 理解装饰器原理
高级阶段(持续学习)#
- 微服务开发
- GraphQL 支持
- WebSocket
- 性能优化
NestJS 与 Express 对比#
| 特性 | NestJS | Express |
|---|---|---|
| 架构 | 模块化 | 自由 |
| 语言 | TypeScript | JavaScript/TS |
| 依赖注入 | 原生支持 | 无 |
| 装饰器 | 广泛使用 | 无 |
| 学习曲线 | 较陡 | 平缓 |
| 适合项目 | 大型应用 | 小型项目 |
| 代码组织 | 约定优先 | 自由发挥 |
常用命令#
# 安装 NestJS CLI
npm i -g @nestjs/cli
# 创建新项目
nest new my-project
# 创建模块
nest g module user
# 创建控制器
nest g controller user
# 创建服务
nest g service user
# 创建资源(CRUD)
nest g resource user总结#
NestJS 为 Node.js 带来了企业级的开发体验:
- 模块化架构—— 代码组织清晰
- 依赖注入—— 解耦和可测试性
- 装饰器路由—— 声明式定义
- TypeScript 优先—— 类型安全
- 丰富的生态—— 集成各种数据库和工具
如果你需要构建大型 Node.js 应用,特别是企业级项目,NestJS 是最佳选择。它让 Node.js 开发变得"正规化"。
下期预告:NestJS 是"正规军",而 Express 则是"轻骑兵"—— 它是 Node.js 最经典、最灵活的框架。下一篇文章我们来详细介绍这个"Node.js 的老朋友"。
