快速入门nest.js(9/10)--openAPI

简介: openAPI规范是一种与语言无关的定义格式,用于描述RESTful API。Open API文档允许我们描述我们整个API,包括:可用的操作和端点;操作参数:每个操作的输入输出;认证方法;联系信息、许可、使用条款和其他信息;

简介

openAPI规范是一种与语言无关的定义格式,用于描述RESTful API。Open API文档允许我们描述我们整个API,包括:

  • 可用的操作和端点;
  • 操作参数:每个操作的输入输出;
  • 认证方法;
  • 联系信息、许可、使用条款和其他信息;

安装


// npm i @nestjs/swagger swagger-ui-express // 如果你切换为了fastify,则安装fastify-swagger


基本


import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { AppModule } from './app.module';
// ...
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
// ...
  const options = new DocumentBuilder()
    .setTitle('Iluvcoffee')
    .setDescription('Coffee application')
    .setVersion('1.0')
    .build();
  
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api', app, document);   // 第一个参数为路由路径
  await app.listen(3000);
}
bootstrap();

插件使用


虽然上述可以生成最基本的api文档,但是我们会发现没有请求正文的期望等信息:

我们的应用程序代码实际上有一个专用的DTO类,它代表此端点的输入API,但是这还不足以自动生成openAPI。Typescript的元数据反射系统有几个限制,比如确定一个类包含哪些属性,或者识别给定属性是可选的还是必须的。其中一些约束可以在编译时解决,Nest提供了一个插件来增强Typescript编译过程,以减少我们需要创建的样板代码数量来解决这个问题。这个插件是可选的,如果你愿意,你可以手动声明所有的swagger装饰器。最好还是在需要覆盖插件提供的基本功能的某个地方添加特定的装饰器。

使用这个插件:


// nest-cli.json
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
      // 这里开始
  "compilerOptions": {
    "deleteOutDir": true,
    "plugins": ["@nestjs/swagger/plugin"]
  }
}


然后重新打开swagger,我们就可以发现其反映了CreateCoffeeDto及其所有属性:

但是UpdateCoffeeDto却还是不能正常反映出来:

让我们打开该Dto文件:

import {PartialType} from '@nestjs/mapped-types';
import { CreateCoffeeDto } from './create-coffee.dto';
export class UpdateCoffeeDto extends PartialType(CreateCoffeeDto){
}


改为:


    
import {PartialType} from '@nestjs/swagger';  // 这里,它会实现相同的功能并且将每个属性标记会可选的。
import { CreateCoffeeDto } from './create-coffee.dto';
export class UpdateCoffeeDto extends PartialType(CreateCoffeeDto){
}


然后就有了对应的反映。

@ApiProperty()


定义实例值并添加属性描述


    
// create-coffee.dto
import { ApiProperty } from '@nestjs/swagger';
import { IsString } from 'class-validator';
export class CreateCoffeeDto {
  @ApiProperty({description: 'The name of a coffee.'})
  @IsString()
  readonly name: string;
  @ApiProperty({description: 'The brand of a coffee.'})
  @IsString()
  readonly brand: string;
  @ApiProperty({example: []})
  @IsString({each: true})
  readonly flavors: string[];
}


然后就可以看到对应的描述和和示例了:

@ApiResponse()


// coffees.controller
// @ApiResponse({status: 403, description: 'Forbidden.'})  // 或者下面这种
@ApiForbiddenResponse({description: 'Forbidden.'})
@Public()
@Get()
findAll(@Protocol() protocol, @Query() paginationQuery: PaginationQueryDto) {
    console.log(protocol);
    return this.coffeeService.findAll(paginationQuery);
}

后我们就可以看到对应的路由上多了一种响应示例:

标签

为一组资源添加标签,这样就可以将端点的相关集分组和组织在一起。


    
@ApiTags('coffees')
@Controller('coffees')
export class CoffeesController {
    // ...
}

    


image.png

目录
相关文章
|
7月前
|
存储 监控 JavaScript
Node.js 性能平台5分钟快速入门
首先,确保拥有阿里云账号并开通服务,以及一台可上网的服务器。然后,创建应用并记下App ID和App Secret。通过tnvm安装Node.js性能平台组件,包括alinode和agenthub,检查安装成功的方法是`which node`和`which agenthub`命令显示路径包含`.tnvm`。接着,启动agenthub,并在服务器上运行一个示例应用(demo.js),该应用模拟计算密集型任务。最后,通过阿里云控制台观察监控数据和执行诊断操作。注意,性能平台每分钟上传一次日志,可能需等待几分钟才能看到数据。详细部署指南可参考官方文档。
88 6
|
6月前
|
JavaScript 前端开发 安全
【JavaScript 】DOM操作快速入门
【JavaScript 】DOM操作快速入门
98 2
|
6月前
|
JavaScript 前端开发 Java
JavaScript快速入门
JavaScript快速入门
34 1
|
5月前
|
SQL 前端开发 JavaScript
JavaScript快速入门 有这一篇就够!
JavaScript快速入门 有这一篇就够!
|
5月前
|
存储 JavaScript 前端开发
如何快速入门使用Vue.js
如何快速入门使用Vue.js
51 0
|
6月前
|
Web App开发 存储 JavaScript
JavaScript快速入门
JavaScript快速入门
32 0
|
7月前
|
JavaScript 前端开发 Java
JavaScript 快速入门手册
JavaScript 快速入门手册
|
JavaScript
【JS】快速入门DOM
【JS】快速入门DOM
62 0
|
7月前
|
JavaScript 前端开发 Java
JavaScript 快速入门手册
JavaScript 快速入门手册
43 0
|
7月前
|
JavaScript 前端开发
node.js 快速入门
node.js 快速入门
71 0