宝哥软件园

使用NestJS开发Node.js应用的方法

编辑:宝哥软件园 来源:互联网 时间:2021-08-28

NestJS最早在2017.1 月立项,2017.5 发布第一个正式版本,它是一个基于快递,使用以打字打的文件开发的后端框架。设计之初,主要用来解决开发Node.js应用时的架构问题,灵感来源于棱角分明。在本文中,我将粗略介绍NestJS中的一些亮点。

组件容器

NestJS采用组件容器的方式,每个组件与其他组件解耦,当一个组件依赖于另一组件时,需要指定节点的依赖关系才能使用:

从" @nestjs/common "导入{模块};从""导入{ CatsController } ./猫。“控制器”;从""导入{ CatsService } ./猫。“服务”;从""导入{其他模块}./其他模块';@ Module({导入:[其他模块],控制器:[catscontroler],提供程序: [CatsService],})导出类CatsModule {}依赖注入(直接投资)

与有角的相似,同是使用依赖注入的设计模式开发

当使用某个对象时,DI容器已经帮你创建,无需手动实例化,来达到解耦目的:

//创建一个服务@Inject()导出类TestService { public find(){ return ' hello world ';}}//创建一个控制器@控制器()导出类测试控制器{控制器(私有只读TestService : TestService){ } @ Get()公共find info(){返回此。TestService。find()} }为了能让测试控制器使用TestService服务,只需要在创建组件时,作为供应者写入即可:

@ Module({控制器:[测试控制器],providers :[测试服务],})导出类TestModule {}当然,你可以把任意一个带@Inject()的类,注入到组件中,供此组件的控制器或者服务使用。

背后的实现基于装饰器反射元数据,详情可以查看深入理解类型脚本-反映元数据。

细粒化的中间件

在使用表达时,我们会使用各种各样的中间件,譬如日志服务、超时拦截,权限验证等。在NestJS中中间件功能被划分为中间件、过滤器、管道Grards ,拦截器。

例如使用过滤器,来捕获处理应用中抛出的错误:

@Catch()导出类AllExceptionsFilter实现异常过滤器{ Catch(异常: any,主机: ArgumentsHost){ const CTX=host。switch tottp();常数响应=CTX。GetResponse();常量请求=CTX。GetRequest();常量状态=异常。GetStatus();//一些其他做的事情,如使用日志回应。状态(状态)。json({ statusCode:状态,timestamp:新日期()。toISOString(),path: request.url,});}}使用拦截器,拦截反应数据,使得返回数据格式是{ data: T }的形式:

从" @nestjs/common "导入{可注射,嵌套拦截器,执行上下文};从“rjs”导入{可观察到};从“rxjs/运算符”导入{ map };导出接口响应集{数据:T} @可注射()导出类TransformInterceptorT实现了嵌套拦截,响应集{拦截(上下文:执行上下文,调用$: ObservableT), ObservableResponseT {返回调用$ .pipe(map(data=({ data })));}}使用警卫,当不具有管理员角色时,返回401:

从" @nestjs/common "导入{ reflectMetadata };导出常量角色=(.roles : string[])=reflectMetadata(' roles ',roles);@ Post()@角色(' admin ')异步创建(@ Body()CreateCatDto : CreateCatDto){ this。catsservice。创建(创建目录);}数据验证

得益于类验证器与级变压器对传入参数的验证变的非常简单:

//创建Dtoexport类ContentDto { @ IsString()@ text : string } @ Controller()导出类测试控制器{控制器(私有只读TestService : TestService){ } @ Get()公共查找信息(@ Param())Param : ContentDto//使用){返回this.testService.find() }}当所传入参数文本不是线时,会出现400 的错误。

GraphQL

GraphQL由脸谱网开发,被认为是革命性的应用程序接口工具,因为它可以让客户端在请求中指定希望得到的数据,而不像传统的休息那样只能在后端预定义。

NestJS对阿波罗服务器进行了一层包装,使得能在NestJS中更方便使用。

在表达中使用阿波罗服务器时:

const express=require(' express ');const { ApolloServer,gql }=require(' Apollo-server-express ');//使用图形QL模式语言常量类型defs=gql `类型查询{ hello : String } `构造一个架构;//为架构字段提供解析器函数解析器={ query : { Hello :()=' Hello world!', },};const server=new ApolloServer({ typeDefs,resolvers });const app=express();服务器。applymiddleware({ app });const port=4000 app . listen({ port },()=console。日志(` http://localhost : $ { port } $ { server }处的服务器就绪。graphqlpath } `)),);在NestJS中使用它:

//测试。graph qltype Query { hello :字符串;}//test.resolver.ts@Resolver()导出类{ @ Query()public Hello(){返回‘Hello wolrd’;}}使用装饰者的方式,看起来也更打字稿。

其他

除上述一些列举外,NestJS实现微服务开发、配合打字、以及普里西玛等特点,在这里就不展开了。

参考

深入理解类型脚本-反映元数据

鸡蛋VS NestJS

NestJS官网

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+