NestJS

Node.js TypeScript 后端框架 - Angular 风格架构,依赖注入,企业级模式开箱即用

TL;DR

一句话:NestJS 是 Node.js 后端的 Angular 风格架构——TypeScript、依赖注入、企业级模式开箱即用。

核心优势

  • TypeScript 优先 - 装饰器和强类型无处不在
  • 依赖注入 - 代码默认可测试、模块化
  • CLI 生成器 - 一键生成模块、控制器、服务
  • 企业级 - 守卫、拦截器、管道、过滤器

Core Concepts

概念 1:模块

一切都组织成模块。每个功能有自己的模块。

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],  // 分享给其他模块
})
export class UsersModule {}

概念 2:控制器 + 服务

控制器处理 HTTP。服务处理逻辑。依赖注入连接它们。

// users.controller.ts
@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}  // 依赖注入

  @Get()
  findAll() {
    return this.usersService.findAll();
  }

  @Post()
  create(@Body() dto: CreateUserDto) {
    return this.usersService.create(dto);
  }
}

// users.service.ts
@Injectable()
export class UsersService {
  private users = [];

  findAll() { return this.users; }
  create(dto) { this.users.push(dto); return dto; }
}

概念 3:DTO + 验证

用 class-validator 装饰器做请求验证:

import { IsString, IsEmail, IsOptional } from 'class-validator';

export class CreateUserDto {
  @IsString()
  name: string;

  @IsEmail()
  email: string;

  @IsOptional()
  @IsString()
  bio?: string;
}

Quick Start

创建项目

npm i -g @nestjs/cli
nest new my-app
cd my-app

生成功能模块

nest g resource users
# 创建:模块、控制器、服务、DTO、测试

运行

npm run start:dev
# 打开 http://localhost:3000

Gotchas

别忘了导入模块

// ❌ 服务不可用
@Module({
  controllers: [OrdersController],
  providers: [OrdersService],
})
export class OrdersModule {}

// ✅ 导入 UsersModule 才能用 UsersService
@Module({
  imports: [UsersModule],  // 导入模块
  controllers: [OrdersController],
  providers: [OrdersService],
})
export class OrdersModule {}

全局启用验证

// main.ts - DTO 生效的必要配置
import { ValidationPipe } from '@nestjs/common';

app.useGlobalPipes(new ValidationPipe({
  whitelist: true,  // 过滤掉未知属性
  transform: true,  // 自动类型转换
}));

异步配置

// ❌ 同步配置 - 无法使用 ConfigService 的环境变量
TypeOrmModule.forRoot({ host: 'localhost' })

// ✅ 异步配置 - 注入 ConfigService
TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  inject: [ConfigService],
  useFactory: (config: ConfigService) => ({
    host: config.get('DB_HOST'),
  }),
})

When to Use

适合

  • 大型 API
  • 企业级应用
  • 熟悉 Angular 的团队
  • 微服务架构

不适合

  • 简单脚本或小 API(用 Express)
  • Serverless 函数(冷启动开销大)
  • 不想用装饰器/DI 的项目

对比

特性NestJSExpressFastify
结构有主见极简极简
TypeScript内置附加内置
依赖注入
学习曲线中等简单简单

Next Steps

Cheatsheet

模式代码
创建项目nest new name
生成资源nest g resource name
生成模块nest g module name
生成服务nest g service name
GET 路由@Get() / @Get(':id')
POST 路由@Post()
路径参数@Param('id') id: string
查询参数@Query('page') page: number
请求体@Body() dto: CreateDto
请求头@Headers('auth') auth: string