出现了一个新项目,一个不同的任务和这个客户团队的团队管理,而适用的系统也有同样的流程,最近的中心之类的。的新项目需要在另外两个平台之类。之间做一些事情。目前只需要先设置其中的 API,因此我们选择使用 NodeJS 的框架Nest.js来实现其中一个 API。
快速启动
开启estjs项目有3种接入的方式。
使用鸟巢自带的工具
npm i -g @nestjs/cli |
不这种方式,也可以建议在节点安装类的工具,这样可以方便的各种nestjs的模块,比如控制器和服务类的。
直接使用starter项目
这里还有一个用于启动的样例项目,可以直接使用。
git clone https://github.com/nestjs/typescript-starter.git my-app |
这个项目信息还是把Typescript。不过要记得之前的git删掉了。
用 npm 安装所需的包
npm i --save @nestjs/core @nestjs/common rxjs 反射元数据 |
安装nestjs的core和common就可以,rxjs和react-metadata也是必须的。
比较,目录的类别是由自己创建的。不过也可以使用类别的类别创建自己的类别,控制器之类的自动创建好。
类似的语言API,可以嵌套很多框架,类似的,自动生成或者替换其他的,这样约定的习惯非常重要,不要创造一些“特殊”的结构避免以后坑坑洼洼。
创建控制器
创建好项目之后,我创建了一个controller,nest.js中的controller可以通过没有一个路由类的文件配置直接提供路由。
嵌套 g 控制器项目 |
nest.js目录约定是按业务模块划分,因为src目录中会出现一个projects的目录,该目录下会生成一个projects.controller,以及设备的单元测试。
创建服务
授权创建服务,用于目标任务管理平台关于项目的API。
巢g服务项目 |
创建controller和service管理模块里,可以在每次加入后用git diff查看一下生成哪些代码,也好心理有数。
从“@nestjs/common”导入{控制器、获取、请求}; |
从'@nestjs/common'导入{可注射}; |
结构和修饰
我想特别说明一下的是,虽然我的服务和服务都使用了相同的,但他们是很多人。只是项目名称和服务说的都是一个,而控制器不是它们的不同之处在于,它们的意义,也有一个典型的过程,平均过程中更好的拥有更多的平均数,比比皆是。如果只是把这个对象这个毫无变化的映射出来,那过程是毫无意义的。
这里的服务实际上是提供者的一种,而提供者的意义是从不同的地方提供的数据或其他东西。而控制器的名称projects是指我创建的API所要的数据是项目,所以它们在这里提供的API确实是同一个东西,名称也一样。
一下的业务逻辑是需要从目标任务管理平台获取项目,然后过滤出不同特性的项目设置,他们记录一种任务任务,需要分配给人员;另一种叫注释,只是标记。于是我创建了2个控制器,taskController和noteController,但是,它们都调用ProjectsService去使用不同的过滤条件获取数据。
HTTP请求
使用nest.js官方Http模块HttpModule
就可以向其他API发出请求。该模块本身也是封装的Axios,所以起来很方便。先安装相关模块。
npm i --save @nestjs/axios axios |
然后在app.module中引入。
从“@nestjs/axios”导入 { HttpModule }; |
处理 Axios 对象
在服务中可以这样处理http请求的返回值。
从“@nestjs/axios”导入 { HttpService }; |
因为 axios 一线,用数据作为关键,map 的。管道图都是来自 rxjs。rxjs 的核心是可服务的,使用响应式编程的方式,就是需要和异步方式的因此这里你看不到promise或者await/async之类的关键字。
配置
上面的请求,我用了一个本地的json接口。 ,不能直接代码被git提交。
所以我需要加上config的配置,安装nest.js的config包,它的封装其实应该是dotenv包,使用nodejs的话,会很像这个包。
npm i --save @nestjs/config |
在app.module中引入config模块。
从“@nestjs/config”导入 { ConfigModule }; |
这里使用该模块的示例模式的因为。而对于对象的参数load
是可以把配置的。
引入的config/configuration
文件是新创建的配置对象。
导出默认 () => ({ |
我配置了端口,以及API的URL和Token。
然后可以生成Typescript的接口,使用nest文件。
嵌套 g 接口运行配置 |
导出接口 RunnConfig { |
在服务中就可以获取这些配置项。
从“@nestjs/config”导入 { ConfigService }; |
不要忘记在根目录下创建.env
文件进入配置的值。另外按习惯,可以创建.env.sample文件,只包含key,没有值,类似的模板,被git提交管理。而.env文件被gitignore 。只在本地保留。在服务器上需要另外生成一份。
添加标题
URL使用,但由于headers中添加。在app.module中使用HttpMoule的register就可以配置其中所以需要使用Axios的token。不过token已经配置了,方法比较解决的registerAsync,注入配置后,在useFactory中使用。
... |
这样我就创建了一个基本的API框架,并请求了一个简单的目标任务管理系统的API获取数据。
API文档
另外,由于客户需要了解和测试我们的API,所以需要一个postman的api集合。我准备使用Swagger,这是一个API的自动生成工具,它会根据框架中定义的API和参数,自动生成一个页面,包含所有的API和参数说明,以及可以请求该API。当然这需要直接物质器的辅助。先安装nestjs的swagger包。
npm i --save @nestjs/swagger |
然后在main.ts
中引入并配置。
|
然后就可以通过http://localhost:3000/api
访问该API文档页面。不过目前所有API教程不能使用默认标签下。官方示例中的addTag方法虽然可以添加一个标签,但并指定了一些API该标签。我需要通过物质器实现。
在控制器的方法上使用@ApiTags('Project')
启用,该方法会被放置在项目标签下。
http://localhost:3000/api-json
的 JSON 格式是最重要的,可以使用它在 Postman 中直接导入。