2023-12-12 02:53:24
NestJS 是一款基于 TypeScript 的 Node.js 框架,专为构建高效、可扩展的服务器端应用设计,融合了面向对象编程(OOP)、函数式编程(FP)和响应式编程(RP)的优势,通过模块化、依赖注入等核心机制简化开发流程。
核心概念详解模块化NestJS 应用以模块为基本组织单位,每个应用至少包含一个根模块(AppModule),可通过创建子模块实现代码分离与复用。模块通过 @Module() 装饰器定义,封装控制器(controllers)、服务(providers)及依赖模块(imports)。示例:
@Module({ controllers: [UsersController], providers: [UsersService],})export class UsersModule {}依赖注入(DI)通过 DI 管理对象间的依赖关系,提供者(如服务)在模块中注册后,可被其他组件自动注入,提升代码可测试性与可维护性。示例:
@Injectable()export class UsersService { constructor(private httpService: HttpService) {}}控制器处理 HTTP 请求并返回响应,使用 @Controller() 定义路由前缀,通过 @Get()、@Post() 等装饰器映射具体路由。示例:
@Controller('users')export class UsersController { @Get() findAll() { return 'All users'; }}服务封装业务逻辑与数据访问,通过 @Injectable() 标记为可注入对象,通常被控制器调用。示例:
@Injectable()export class UsersService { private users = [{ id: 1, name: 'John' }]; findAll() { return this.users; }}中间件在请求到达控制器前或响应返回后执行逻辑(如日志记录),通过 NestMiddleware 接口实现,需在模块中通过 app.use() 注册。示例:
@Injectable()export class LoggerMiddleware implements NestMiddleware { use(req: Request, res: Response, next: NextFunction) { console.log(`Request: ${req.method} ${req.url}`); next(); }}拦截器在请求处理前后转换数据或添加额外逻辑(如响应格式化),通过实现 NestInterceptor 接口并使用 @UseInterceptors() 装饰器应用。示例:
@Injectable()export class TransformInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler) { return next.handle().pipe(map(data => ({ data, timestamp: new Date() }))); }}提供者与依赖范围提供者(如服务、仓库)可通过 DI 注入,支持三种实例范围:
singleton(默认):全局单例。
request:每个请求创建新实例。
transient:每次注入创建新实例。自定义提供者示例:
const myProvider = { provide: 'TOKEN', useValue: { key: 'value' } };@Module({ providers: [myProvider] })export class AppModule {}生命周期钩子提供模块与应用生命周期事件(如初始化、启动)的回调接口,例如 OnModuleInit 在模块加载时触发。示例:
@Injectable()export class AppService implements OnModuleInit { onModuleInit() { console.log('Module initialized'); }}NestJS 通过其设计模式与工具链,成为构建现代服务器端应用的理想选择。