的Nest.js初体验。以新手的角度学习Typescript,学习了总结ts的系列文章。希望对读者有所帮助。至于在学习了TS基础之后如何进行开发实践,本系列会结合Nest.js的Node服务器框架。Nest(NestJS)是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,使用TypeScript构建并得到完全支持(但仍允许开发人员使用纯JavaScript进行编码),并结合了OOP(面向对象编程)、FP(函数式编程)和FRP(函数式响应式编程)元素的特性。Nest使用强大的HTTPServer框架,默认支持Express框架,简单易用。Nest在Express上进行抽象,结合TS强大的语言体系,实现高效快速的开发。Nest是我接触Express框架后感兴趣的Node框架,对它也比较熟悉。选择Nest也简单易行。截至作者发文时,Nest在Github上有37.7KStats,足以证明它的火爆程度。Nest提供开箱即用的应用程序架构,允许开发人员和团队创建高度可测试、可扩展、松散耦合且易于维护的应用程序。该架构深受Angular的启发。项目创建及开发环境项目开始前,先介绍一下开发环境:node.js:14.15.1typescript:3.8.3nest.js:7.6.15先决条件请确保你的操作系统安装了Node.js(>=10.13.0,v13除外)。创建项目要使用Nestcli创建项目,首先要安装相关脚手架,运行以下命令创建第一个Nest项目。$npmi-g@nestjs/cli$nestnewproject-name当然也可以使用yarn命令创建:$yarnadd@nest/cli$nestnewproject-name输入以上命令后得到如下内容:G:\代码>nestnewnest-test?我们将在几秒钟内构建您的应用程序..CREATEnest-test/.eslintrc.js(631bytes)CREATEnest-test/.prettierrc(51bytes)CREATEnest-test/nest-cli.json(64bytes)CREATEnest-test/package.json(1971bytes)CREATEnest-test/README.md(3339bytes)CREATEnest-test/tsconfig.build.json(97bytes)CREATEnest-test/tsconfig.json(339bytes)CREATEnest-test/src/app.controller.spec.ts(617bytes)CREATENest-test/src/app.controller.ts(274bytes)CREATEnest-test/src/app.module.ts(249bytes)CREATENest-test/src/app.service.ts(142bytes)CREATENest-test/src/main.ts(208bytes)CREATEnest-test/test/app.e2e-spec.ts(630bytes)CREATEnest-test/test/jest-e2e.json(183bytes)?Whichpackagemanagerwouldyou??touse?纱?????Installationinprogress...?如上图,会问包管理是选择yarn还是npm,笔者这里选择yarn。🚀成功创建项目nest-test👉开始使用以下命令:$cdnest-test$yarnrunstartThanksforinstallingNest🙏Pleaseconsiderdonatingtoouropencollectivetohelppusmaintainthispackage.🍷Donate:https://opencollective.comGoforwardandfinally创造成功。根据以上提示,我们进入项目进行操作。项目目录如下:运行yarnstart或npmrunstart运行项目并启动项目服务。此时在浏览器地址栏中输入http://localhost:3000就可以看到helloworld了。关于路由的详细信息打开src目录下的main.ts文件,可以看到在@Controller()装饰器中使用了路由前缀,可以更方便的对路由进行分组,减少代码重复。main.tsimport{NestFactory}from'@nestjs/core';import{AppModule}from'./app.module';asyncfunctionbootstrap(){constapp=awaitNestFactory.create(AppModule);//表示nest的工厂函数是createdAppModuleawaitapp.listen(3000);//表示项目的监听端口为3000}bootstrap();controller是控制传入的请求返回给客户端显示的内容,当然你也可以添加指定的路由。我们可以在app.controller.ts文件中添加如下代码:@Get("/home")getHome():string{return"myhome";}运行获取:设置本地路由前缀路由也可以设置本地和全局prefixes,当所有路由共享一个公共前缀时,使用前缀可以避免冲突。在@Controller()中写best可以表示当前文件中的所有路由都以best为前缀。如下图:@Controller("best")exportclassAppController{constructor(privatereadonlyappService:AppService){}@Get()getHello():string{returnthis.appService.getHello();}}运行结果:设置全局路由前缀即可在main.ts文件中添加app.setGlobalPrefix()设置全局路由前端:app.setGlobalPrefix('nest-test');//全局路由前缀操作结果:controller控制器负责处理传入的请求并将响应返回给客户端。控制器的目的是接收特定于应用程序的请求。控制此控制器在路由中接收哪些请求主体。很多时候,每个控制器都有多个路由,不同的路由可以执行不同的动作。为了创建一个基本的控制器,我们使用类和装饰器。装饰器将类与所需的元数据相关联,并使Nest能够创建路由映射(将请求绑定到适当的控制器)。app.controller.tsimport{Controller,Get}from'@nestjs/common';import{AppService}from'./app.service';@Controller()exportclassAppController{constructor(privatereadonlyappService:AppService){}@Get()getHello():string{returnthis.appService.getHello();}}同样,我们可以使用命令创建新的controller模块,方便项目管理。$nestgcontrollerusers现在在src中生成一个users目录文件:初始化后的controller文件如下:之前的controller文件,可以实现简单业务逻辑的处理,但是在实际开发中,需要controller和业务分离,代码解耦。$nestgserviceusers现在在src中users目录下生成业务文件:users.service.tsimport{Injectable}from'@nestjs/common';@Injectable()exportclassUsersService{//添加用户业务逻辑addUser(username:string,password:string):string{console.log(`createuser:username--${username}password--${password}`);return"addusersuccess";}}users.controller.tsimport{Body,Controller,Post}from'@nestjs/common';import{UsersService}from"./users.service";@Controller('users')exportclassUsersController{constructor(privatereadonlyusersService:UsersService){}//Nest是围绕通常所说的依赖注入构建的,具有强大的设计模式。Nest通过UsersService创建并返回一个UsersService实例。@Post("add")addUser(@Body()body){returnthis.usersService.addUser(body.username,body.password);}}使用postman模拟用户请求,运行结果如下:Module模块是使用带有Module()装饰器注释的@Classes,@Module()装饰器为元数据利用提供了一个有组织的应用程序结构。每个应用程序至少有一个模块和一个根模块。根模块是Nest用来构建应用程序图的起点——Nest用来解析模块和提供者关系和依赖关系的内部数据结构。虽然理论上非常小的应用程序可能只有根模块,但这不是典型的情况。我们要强调的是,强烈推荐使用模块作为组织组件的有效方式。因此,对于大多数应用程序,最终的体系结构将采用多个模块,每个模块都封装了一组密切相关的功能。@Module()装饰器使用了单个对象,它的属性描述了模块:我们看看上面创建的Service和Controller是如何被访问和运行的?打开app.modelu.ts可以看到:import{Module}from'@nestjs/common';import{AppController}from'./app.controller';import{AppService}from'./app.service';import{UsersController}from'./users/users.controller';import{UsersService}from'./users/users.service';@Module({imports:[],controllers:[AppController,UsersController],providers:[AppService,UsersService],})exportclassAppModule{}我们创建子模块后,CreatedUsersController和UsersService,即使不新建模块文件,也可以通过路由访问,因为系统会自动将其添加到app中。模块.ts文件。当然我们也可以根据需求创建子模块的模块文件,执行如下命令即可:$nestgmoduleusers看到此时生成了模块子模块文件:初始化文件如下:import{Module}from'@nestjs/common';@Module({})exportclassUsersModule{}此时需要将users模块的UsersController和UsersService组装到模块文件中。这样当其他模块模块要导入Users模块时,不需要同时有Controller和Service,方便了本模块的管理。import{Module}from'@nestjs/common';import{UsersController}from'./users.controller';import{UsersService}from'./users.service';@Module({imports:[UsersModule],controllers:[UsersController],providers:[UsersService],})exportclassUsersModule{}当然需要修改app.module.ts文件,因为子模块已经引入了Controller和Service。import{Module}from'@nestjs/common';import{AppController}from'./app.controller';import{AppService}from'./app.service';//import{UsersController}from'./users/users.controller';//import{UsersService}from'./users/users.service';import{UsersModule}from'./users/users.module';@Module({imports:[UsersModule],controllers:[AppController],providers:[AppService],})exportclassAppModule{}总结本文主要介绍第一个使用Nest创建的项目,简单说明创建过程和使用的模块的概念。路由、控制器、服务、模块都有解释,后面的概念会详细解释。更多细节请参考官方文档。
