大摇大摆的布尔值作为字符串而不是 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 装饰器的情况下添加架构?