NestJS最早成立于2017年1月,第一个正式版于2017年5月发布,是一个基于Express的使用TypeScript开发的后端框架。设计之初主要是为了解决开发Node.js应用时的架构问题,受到Angular的启发。在本文中,我将简要概述NestJS中的一些亮点。组件容器NestJS采用了组件容器的方式,每个组件都与其他组件解耦。当一个组件依赖另一个组件时,需要指定要使用的节点的依赖:import{Module}from'@nestjs/common';import{CatsController}from'./cats.controller';import{CatsService}from'./cats.service';import{OtherModule}from'../OtherModule';@Module({imports:[OtherModule],controllers:[CatsController],providers:[CatsService],})exportclassCatsModule{}依赖注入(DI)类似于Angular,也是采用依赖注入的设计模式开发的。在使用一个对象时,DI容器已经为你创建好了,不需要手动实例化来实现解耦://创建一个服务@Inject()exportclassTestService{publicfind(){return'helloworld';}}//创建一个controller@Controller()exportclassTestController{controller(privatereadonlytestService:TestService){}@Get()publicfindInfo(){returnthis.testService.find()}}以便TestController使用TestService服务,你只需要在创建模块时将其写成提供者:@Module({controllers:[TestController],providers:[TestService],})exportclassTestModule{}当然,你可以注入任何类@Inject()到该模块的控制器或服务的模块中using背后的实现是基于Decorator+ReflectMetadata。详见深入理解TypeScript-ReflectMetadata。细粒度中间件在使用Express的时候,我们会用到各种中间件,比如日志服务、超时拦截、权限校验等。在NestJS中,中间件功能分为Middleware、Filters、Pipes、Grards、Interceptors。例如,使用Filter来捕获和处理应用程序中抛出的错误:constresponse=ctx.getResponse();constrequest=ctx.getRequest();conststatus=exception.getStatus();//其他事情要做,比如日志响应.status(status).json({statusCode:status,timestamp:newDate().toISOString(),path:request.url,});}}使用拦截器拦截响应数据,使得返回的数据格式为{data:T}:import{Injectable,NestInterceptor,ExecutionContext}from'@nestjs/common';import{Observable}from'rxjs';从'rxjs/operators'导入{map};exportinterfaceResponse
