大摇大摆的布尔值作为字符串而不是 NestJS 中的布尔值发送

Posted

技术标签:

【中文标题】大摇大摆的布尔值作为字符串而不是 NestJS 中的布尔值发送【英文标题】:Boolean in swagger sent as string instead of boolean in NestJS 【发布时间】:2021-05-11 13:47:04 【问题描述】:

我不明白为什么 Swagger 将我的布尔值作为字符串而不是布尔值发送。

我已在 Dto 中将该字段的值设置为布尔值。

它与 Postman 一起发送布尔值,但不适用于 Swagger,它作为字符串发送...

这是我使用CreateIssueDto的控制器

/**
   * Create an issue
   * @param image
   * @param issue
   */
  @ApiBearerAuth()
  @ApiOperation( description: 'Create an issue' )
  @UseInterceptors(FileInterceptor('image'))
  @ApiConsumes('multipart/form-data')
  @Roles(Role.HeadOfPole, Role.Corrector, Role.Editor)
  @Post('create')
  createIssue(@UploadedFile() image, @Body() issue: CreateIssueDto) 
    image ? (issue.image = image.path) : null;
    return this.issuesService.createIssue(issue);
  

这是我的 CreateIssueDto 和 Swagger 装饰器

import  ApiProperty, ApiPropertyOptional  from '@nestjs/swagger';
import  IsNotEmpty  from 'class-validator';

export class CreateIssueDto 
  @ApiProperty()
  @IsNotEmpty()
  userId: number;

  @ApiProperty()
  @IsNotEmpty()
  description: string;

  @ApiPropertyOptional()
  isCritical: boolean;

  @ApiPropertyOptional( type: 'string', format: 'binary' )
  image: string;

我添加了两个日志来打印控制器中的差异

console.log(issue);
console.log(issue.isCritical, typeof issue.isCritical);

所以这里是使用 Swagger 的 isCritial 的对象和类型

[Object: null prototype] 
  userId: '1',
  description: 'There is a problem',
  isCritical: 'true'

true string

这里是使用 Postman 的 isCritial 的对象和类型

 userId: 1, description: 'There is a problem', isCritical: true 
true boolean

【问题讨论】:

【参考方案1】:

使用'class-transformer'中的Transform函数来修复它,有两种方法:

第一种,直接在dto文件中转换值:

@Transform(value => 
  return value === 'true' || value === true || value === 1 || value === '1'
)
isCritical: boolean;

强烈推荐的第二种方法是在 decorators 存储库下导出 ToBoolean 函数,并在任何地方使用它:

 export function ToBoolean(): (target: any, key: string) => void 
    return Transform((value: any) => value === 'true' || value === true || value === 1 || value === '1');

CreateIssueDto 文件:

export class CreateIssueDto 
  ///
  @ApiPropertyOptional()
  @ToBoolean()
  isCritical: boolean;
  ///

【讨论】:

我不得不在函数包装器“export function ToBoolean(): (target: any, key: string) => void return Transform(( value, . ..props : any) => return ( value === 'true' || value === true || value === 1 || value === '1' ); ); "

以上是关于大摇大摆的布尔值作为字符串而不是 NestJS 中的布尔值发送的主要内容,如果未能解决你的问题,请参考以下文章

在 postgresql 中,如何在 jsonb 键上返回布尔值而不是字符串?

Laravel 布尔值在查询中返回“1”/“0”而不是 true/false

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

@Get 控制器和布尔查询中的 NestJS 验证失败(需要数字字符串)

Php fetch 返回字符串而不是布尔“真/假”值

如何使用 NestJS 序列化返回 id 字符串而不是 _bsontype