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,
}));
快速开始
-
创建新项目:
nest new my-project cd my-project -
生成资源:
nest g module users nest g controller users nest g service users -
设置验证:
npm install class-validator class-transformer -
在 main.ts 中配置全局管道:
app.useGlobalPipes(new ValidationPipe({ whitelist: true })); -
添加 Swagger 文档:
npm install @nestjs/swagger swagger-ui-express
生产检查清单
- [ ] 配置全局异常过滤器
- [ ] 全局启用验证管道
- [ ] 健康检查端点(/health)
- [ ] 启用 Swagger 文档(仅限开发)
- [ ] 配置速率限制
- [ ] 配置 Helmet 安全头
- [ ] 正确配置 CORS
- [ ] 启动时验证环境配置
- [ ] 处理优雅关闭
- [ ] 使用相关 ID 的请求日志记录
反模式
- 胖控制器:控制器应仅处理 HTTP 问题,将逻辑委托给服务
- 循环依赖:谨慎使用
forwardRef(),重构模块结构 - 跳过 DTOs:始终使用 DTOs 和 class-validator 验证输入
- 上帝模块:将大型模块拆分为更小、更专注的模块
集成点
- 数据库:
@nestjs/typeorm,@nestjs/mongoose,@nestjs/prisma - 缓存:
@nestjs/cache-manager与 Redis - 队列:
@nestjs/bull用于作业处理 - GraphQL:
@nestjs/graphql与 Apollo - 微服务:
@nestjs/microservices用于分布式系统