跳过正文
  1. 文章/

NestJS 完全指南:Node.js 的企业级框架

sun.ao
作者
sun.ao
我是 sun.ao,一名热爱技术的程序员,专注于 AI 和数智化领域。
目录

如果说 Express 是 Node.js 的"轻骑兵",那么 NestJS 就是 Node.js 的"正规军"。它把后端开发带入了"工程化"的时代。

NestJS 是什么?
#

NestJS 是 Kamil Myśliwiec 于 2017 年创建的 Node.js 企业级框架。它的核心特点是:借鉴 Angular 的架构思想,用 TypeScript 构建可扩展的 Node.js 应用

类比理解
#

对比项ExpressNestJS
架构自由散漫模块化系统
类型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 周)
#

  1. 掌握 TypeScript
  2. 理解 NestJS 项目结构
  3. 学会模块、控制器、服务的基本用法
  4. 掌握依赖注入

进阶阶段(2-3 周)
#

  1. 掌握守卫、拦截器、管道
  2. 学会数据库集成(TypeORM/Prisma)
  3. 掌握验证和异常处理
  4. 理解装饰器原理

高级阶段(持续学习)
#

  1. 微服务开发
  2. GraphQL 支持
  3. WebSocket
  4. 性能优化

NestJS 与 Express 对比
#

特性NestJSExpress
架构模块化自由
语言TypeScriptJavaScript/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 带来了企业级的开发体验:

  1. 模块化架构—— 代码组织清晰
  2. 依赖注入—— 解耦和可测试性
  3. 装饰器路由—— 声明式定义
  4. TypeScript 优先—— 类型安全
  5. 丰富的生态—— 集成各种数据库和工具

如果你需要构建大型 Node.js 应用,特别是企业级项目,NestJS 是最佳选择。它让 Node.js 开发变得"正规化"。


下期预告:NestJS 是"正规军",而 Express 则是"轻骑兵"—— 它是 Node.js 最经典、最灵活的框架。下一篇文章我们来详细介绍这个"Node.js 的老朋友"。

相关文章