NestJS Swagger:在 ApiProperty 装饰器中描述地图

Posted

技术标签:

【中文标题】NestJS Swagger:在 ApiProperty 装饰器中描述地图【英文标题】:NestJS Swagger: Describe Map inside ApiProperty Decorator 【发布时间】:2020-03-30 08:31:48 【问题描述】:

我在 InfluxDB 前面有一个 NestJS API。在 API 中,我想通过来自 nestjs/swagger 的 ApiProptery 装饰器添加属性描述。 我的问题是我不知道如何为地图创建正确的描述。

这是我的模型:

import  Precision  from '../shared/enums';
import  IsEnum, IsInt, IsOptional  from 'class-validator';
import  ApiProperty, ApiPropertyOptional  from '@nestjs/swagger';
import  IsPrimitive  from '../shared/decorator/decorators';

export class CreateMeasurementDto 
  @IsOptional()
  @IsInt()
  @ApiPropertyOptional()
  timestamp: number;

  @IsOptional()
  @IsEnum(Precision)
  @ApiPropertyOptional( enum: Precision )
  precision: Precision;

  @ApiProperty(
    description:
      'Key/value pairs; values can be of type string, boolean or number.',
    type: Map,
  )
  @IsPrimitive()
  datapoints: Map<string, string | boolean | number>;

我在 SwaggerUi 架构部分得到的是:

CreateMeasurementDto
    timestamp   number
    precision   string
                Enum:[ s, ms, u, ns ]
    datapoints* Map 
                

我想至少给出一个例子或描述地图的一个元素。两者都很棒。 地图允许有字符串作为键,而值可以是字符串、布尔值或数字。

这是一个可能的有效载荷,可以接受:


    "precision": "s",
    "datapoints": 
            "voltage": 123.6456,
            "current": 123
        

【问题讨论】:

【参考方案1】:

使用最新版本的nestjs/swagger 即版本4,您可以定义原始定义 Swagger Documentations

@ApiProperty(
  type: 'object',
  additionalProperties: 
    oneOf: [
       type: 'string' ,
       type: 'number' ,
       type: 'boolean' 
    ]
  
)
datapoints: Map<string, string | boolean | number>;

【讨论】:

非常感谢。我刚开始使用 typescript 和 nestjs,并且有一段时间没有使用 swagger。 请你看看这个问题***.com/questions/64939247/nestjs-swagger-mixed-types

以上是关于NestJS Swagger:在 ApiProperty 装饰器中描述地图的主要内容,如果未能解决你的问题,请参考以下文章

如何在nestjs中禁用swagger进行生产

NRWL + NestJS 尝试使用 Swagger 插件

NestJS/swagger:ApiExtraModel 期望啥模型作为参数?

@nestjs/swagger:如何添加 API URL?

“nestjs/swagger”中的哪个函数将 DTO 转换为 Swagger 模型定义?

@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?