前面讲了nest.js 的一些简单安装使用说明,这篇文章讲点我最喜欢的两个nest.js的特性,一个是丰富的命令行工具,一个是和swagger很好而且很方便的集成。
目录
命令行
Swagger
Demo
先看命令行工具:
nest -h
Usage: nest [options]
Options:
-V, --version output the version number
-h, --help output usage information
Commands:
new|n [options] [name] Generate Nest application
build [options] [app] Build Nest application
start [options] [app] Build Nest application
generate|g [options] [name] [path] Generate a Nest element
Available schematics:
┌───────────────┬─────────────┐
│ name │ alias │
│ application │ application │
│ angular-app │ ng-app │
│ class │ cl │
│ configuration │ config │
│ controller │ co │
│ decorator │ d │
│ filter │ f │
│ gateway │ ga │
│ guard │ gu │
│ interceptor │ in │
│ interface │ interface │
│ middleware │ mi │
│ module │ mo │
│ pipe │ pi │
│ provider │ pr │
│ resolver │ r │
│ service │ s │
│ library │ lib │
│ sub-app │ app │
└───────────────┴─────────────┘
info|i Display Nest CLI details
update|u [options] Update Nest dependencies
add [args...] Add a library
可以看到,nest的命令行参数是非常详细的,一般来说,我们可以直接使用:
nest g mo name
创建一个名为name的模块,也可以使用co创建控制器之类的,这样他会为我们自动创建名为name的文件夹,生成module文件,同时在main.ts中自动引用,总体来说是相当省心的。
命令行参数还有很多有意思的东西,比如start和build,这里先不详细介绍,以后会用的到的。
然后是swagger,没接触过swagger的同学可能对这个东西不太理解,总的来说swagger是一款让你更好的书写API文档的框架,同时也可以通过swagger editor生成响应api的代码,是一个可以称为框架的很好的工具。在生成文档方面,一般我们会使用一些配置文件之类的,其实是比较麻烦的,而nest天生集成了 swagger并且使用的是优雅的装饰器的写法,可以说是非常另人喜欢的一个功能了。
首先要在nest里面使用swagger,我们首先要安装:
$ npm install --save @nestjs/swagger swagger-ui-express
接着在main.js中引入:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const options = new DocumentBuilder()
.setTitle('博客接口')
.setDescription('我的博客接口文档')
.setVersion('1.0')
.build();
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup('api-docs', app, document);
await app.listen(3000);
}
bootstrap();
与默认相比,增加的主要是options这一块的内容,这里面的参数可以让你随便定义,最后"SwaggerModule.setup('api-docs', app, document);"是让你去定义路由的,也可以根据你的喜欢去改地址。
这里我们以user里面的一个post请求为例,看一下如何生成swagger文档。
首先创建一个users的模块和控制器:
nest g mo users
nest g co users
然后我们添加几个路由:
import { Controller, Get, Post, Body } from '@nestjs/common';
import { ApiOperation, ApiUseTags } from '@nestjs/swagger';
// import { CreateUserDto } from './dto'
@Controller('users')
@ApiUseTags('用户网站')
export class UsersController {
@Get()
@ApiOperation({title: '显示root目录'})
index() {
return [
{
msg: 'this is user'
}
]
}
@Get(':id')
@ApiOperation({title: '根据id显示用户'})
getUserById() {
return [
{
msg: 'this is an id',
status: 'good'
}
]
}
/*
@Post()
@ApiOperation({title: '创建用户'})
createPost(@Body() body: CreateUserDto) {
return body
}
}
*/
这里我注释掉的是关于使用数据传输对象结合post请求传参的问题,如果懂的人可以去掉注释直接拿这个demo去测试了。
我们简单的分析一下这段代码:
@ApiUseTags('用户网站')
@ApiOperation({title: '根据id显示用户'})
这里是相当于为swagger增加一个描述,一个是描述类,一个是描述行为:
因为我还定义了其他接口,大家只需要看用户网站下面的内容即可。
最后就是刚刚注释的内容,这里使用了数据传输对象的方式,首先在同目录下创建一个dto.ts的文件用来放置数据传输对象,类似于Flask的flask-parse的功能,然后同样用装饰器引用,即最下面post的相关内容。
最后的效果如图:
最后要说的是,因为人不在祖国,所以一些高清的照片无法很好的上传,否则CSDN就会卡死,,,
等回国之后我会尽量补上,以上。