最近开始了一个新项目。这个客户管理着一个庞大的任务和团队集群,不同流程适用的系统也不一样,比如salesforce,hubspots之类的。这次的新项目需要在其他两个平台之间做一些事情。目前只需要先封装其中一个API,所以我们选择使用NodeJS框架Nest.js来实现这组API。快速启动有3种方便的方式启动nestjs项目。使用nest自带的命令行工具npmi-g@nestjs/clinestnewproject-name。即使不使用这种方式,也推荐在node中全局安装命令行工具,这样可以方便的生成各种nestjs模块,比如controller和service之类的。直接使用starter工程这里还有一个启动的sampleproject,可以直接使用。gitclonehttps://github.com/nestjs/typescript-starter.gitmy-appcdmy-appnpminstallnpmrunstart而这个项目也自带Typescript。但是记得删除之前的git信息。使用npm安装需要的包npmi--save@nestjs/core@nestjs/commonrxjsreflect-metadata直接安装nestjs的core和common,rxjs和reflex-metadata也是需要的。这种方法比较干净,需要自己创建目录。不过也可以使用命令行创建控制器之类的,目录会自动创建。总的来说,nestjs与其他语言的API框架类似。很多东西可以自动生成或者不需要写,所以约定俗成的习惯很重要。尽量不要创建一些“独特”的结构,以免将来出现陷阱。创建控制器创建项目后,我创建了一个控制器。nest.js中的controller可以直接通过装饰器提供路由,所以没有路由文件进行配置。nestgcontroller项目nest.js的目录约定是按业务模块划分的,因为src目录下会出现一个projects目录,在这个目录下会生成一个projects.controller和伴随的单元测试。创建服务再创建服务,用于封装目标任务管理平台关于Projects的API。nestg服务项目创建的控制器和服务会自动添加到模块中。在每一代之后,您可以使用gitdiff来检查生成了哪些代码。很高兴知道。从'@nestjs/common'导入{Controller,Get,Req};从'express'导入{Request};从'src/interfaces/project.interface'导入{Project};从'./projects.import{ProjectsService}。service';@Controller('projects')exportclassProjectsController{constructor(privateprojectsService:ProjectsService){}@Get()findAll(@Req()request:Request):Project[]{returnthis.projectsService.findAll();}}从'@nestjs/common'导入{可注入};从'src/interfaces/project.interface'导入{项目};@Injectable()导出类ProjectsService{findAll():项目[]{返回[];}}结构和命名另外,我特别想说明的是,虽然我对controller和service使用了相同的名称,但并不代表它们是一一对应的。很多项目只是为了分层而划分,控制器和服务是一一对应的,其实是不正确的。分层是因为它们具有不同的含义。只有语义明确了,才能在思考的过程中更好的把握代码,才能更好的复用。层次在认知转变中发挥作用。如果你只是映射底层对象而不做任何改变,那么这个过程就没有意义。这里的service其实就是nestjs中的一种provider,provider的意思就是从各个地方提供数据或者其他的东西。我用的ProjectsService的意思是封装另外一个API,所以这个projects来自于目标任务管理平台的API名称。而controller的名字projects指的是我创建的API提供的数据是project,不过这里确实是同一个东西,所以名字也是一样的。假设当前业务逻辑需要从目标任务管理平台获取项目,然后筛选出两个不同特征的项目,一个叫task任务,需要分配给人员;另一种叫做笔记记录,只需标记即可。它们具有不同的属性。然后我将创建2个控制器,taskController和noteController,但它们都调用ProjectsService来获取具有不同过滤条件的数据。HTTP请求可以使用nest.js官方的Http模块HttpModule向其他API发送请求。这个模块其实就是封装了axios,所以使用起来非常方便。先安装相关模块。npmi--save@nestjs/axiosaxios并在app.module中导入。import{HttpModule}from'@nestjs/axios';...@Module({imports:[HttpModule],//importHttpmodulecontrollers:[ProjectsController],providers:[ProjectsService],})exportclassAppModule{}处理Axios对象在服务中可以通过这种方式处理http请求的返回值。从'@nestjs/axios'导入{HttpService};从'@nestjs/common'导入{Injectable};从'rxjs'导入{map,Observable};从'src/interfaces/project.interface'导入{Project};import{AxiosResponse}from'axios';@Injectable()exportclassProjectsService{constructor(privatereadonlyhttpService:HttpService){}findAll():Observable
