NestJSPatterns NestJSPatterns

NestJS Patterns 是一个用于构建可扩展 Node.js 应用程序的综合模式集合,涵盖了模块、提供者、控制器和企业级模式。

后端开发 0 次安装 0 次浏览 更新于 3/5/2026

name: NestJS 模式 description: 构建可扩展 Node.js 应用程序的 NestJS 框架综合模式,包括模块、提供者、控制器和企业模式。

NestJS 模式

概览

NestJS 是一个用 TypeScript 构建的渐进式 Node.js 框架,旨在使用 Angular 的架构模式构建可扩展的服务器端应用程序,包括依赖注入、模块和装饰器。

为什么这很重要

  • 可扩展性:模块化架构使得管理大型代码库更容易
  • 类型安全:内置的 TypeScript 支持减少了运行时错误
  • 企业就绪:内置的微服务、GraphQL、WebSocket 模式
  • 可测试性:DI 系统使单元测试变得简单直接

核心概念

1. 模块架构

// feature.module.ts
@Module({
  imports: [DatabaseModule, CacheModule],
  controllers: [FeatureController],
  providers: [FeatureService, FeatureRepository],
  exports: [FeatureService], // 暴露给其他模块
})
export class FeatureModule {}

最佳实践:

  • 按领域/功能划分模块
  • 使用共享模块进行通用工具
  • 仅导出必要的服务

2. 依赖注入

// 使用构造函数注入
@Injectable()
export class OrderService {
  constructor(
    private readonly orderRepo: OrderRepository,
    private readonly paymentService: PaymentService,
    @Inject('CONFIG') private config: AppConfig,
  ) {}
}

// 自定义提供者
const configProvider = {
  provide: 'CONFIG',
  useFactory: (configService: ConfigService) => configService.get('app'),
  inject: [ConfigService],
};

3. 控制器 & DTOs

@Controller('orders')
@UseGuards(JwtAuthGuard)
export class OrderController {
  @Post()
  @HttpCode(HttpStatus.CREATED)
  async create(
    @Body() dto: CreateOrderDto,
    @CurrentUser() user: User,
  ): Promise<OrderResponseDto> {
    return this.orderService.create(dto, user.id);
  }

  @Get(':id')
  @UseInterceptors(CacheInterceptor)
  async findOne(@Param('id', ParseUUIDPipe) id: string) {
    return this.orderService.findOne(id);
  }
}

4. 异常处理

// 自定义异常过滤器
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    const status = exception instanceof HttpException
      ? exception.getStatus()
      : HttpStatus.INTERNAL_SERVER_ERROR;

    const message = exception instanceof HttpException
      ? exception.message
      : '内部服务器错误';

    response.status(status).json({
      statusCode: status,
      message,
      timestamp: new Date().toISOString(),
    });
  }
}

5. 拦截器 & 管道

// 转换响应拦截器
@Injectable()
export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> {
  intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>> {
    return next.handle().pipe(
      map(data => ({
        success: true,
        data,
        timestamp: new Date().toISOString(),
      })),
    );
  }
}

// 验证管道(全局)
app.useGlobalPipes(new ValidationPipe({
  whitelist: true,
  forbidNonWhitelisted: true,
  transform: true,
}));

快速开始

  1. 创建新项目:

    nest new my-project
    cd my-project
    
  2. 生成资源:

    nest g module users
    nest g controller users
    nest g service users
    
  3. 设置验证:

    npm install class-validator class-transformer
    
  4. 在 main.ts 中配置全局管道:

    app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
    
  5. 添加 Swagger 文档:

    npm install @nestjs/swagger swagger-ui-express
    

生产检查清单

  • [ ] 配置全局异常过滤器
  • [ ] 全局启用验证管道
  • [ ] 健康检查端点(/health)
  • [ ] 启用 Swagger 文档(仅限开发)
  • [ ] 配置速率限制
  • [ ] 配置 Helmet 安全头
  • [ ] 正确配置 CORS
  • [ ] 启动时验证环境配置
  • [ ] 处理优雅关闭
  • [ ] 使用相关 ID 的请求日志记录

反模式

  1. 胖控制器:控制器应仅处理 HTTP 问题,将逻辑委托给服务
  2. 循环依赖:谨慎使用 forwardRef(),重构模块结构
  3. 跳过 DTOs:始终使用 DTOs 和 class-validator 验证输入
  4. 上帝模块:将大型模块拆分为更小、更专注的模块

集成点

  • 数据库@nestjs/typeorm, @nestjs/mongoose, @nestjs/prisma
  • 缓存@nestjs/cache-manager 与 Redis
  • 队列@nestjs/bull 用于作业处理
  • GraphQL@nestjs/graphql 与 Apollo
  • 微服务@nestjs/microservices 用于分布式系统

进一步阅读