NestJS:如果未在有效负载中传递参数,DTO 转换默认值将不起作用

问题描述 投票:0回答:1

我创建了一个接收

POST/ ...
请求的控制器。 其中一个参数是可选的,例如称为
contentType
。 在服务中,我检查 contentType 是否等于某些内容,并根据结果执行某些操作。 因为该参数不是强制性的,所以我想将其设置为默认值。 在这种情况下,我在 DTO 中使用了
@Transform()
装饰器。 当我进行调用时,我看不到我在服务中的装饰器中定义的默认值。

预期:
排序 = {日期:-1}
内容类型 = 'json'

服务结果:
排序=未定义
内容类型 = 未定义

我的 NestJS 配置:
使用nestJS V10
反射元数据版本:^0.2.2"

  1. 主要.ts:

    const app = await NestFactory.create(AppModule);
    ...
    app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      transformOptions: { enableImplicitConversion: true },
      whitelist: true,
      }),
    );

  1. DTO:

    export class ListDto {
    ... more...
        
    @IsObject()
    @IsOptional()
    @Transform(({ value }) => value ?? { date: -1 })
    sort?: Record<string, SortOrder>;  // Types Defined above I just don't want to pollute the example.
            
    @IsString()
    @IsOptional()
    @IsIn(['json', 'xlsx', 'csv'], {
    message: 'contentType must be one of: json, xlsx, csv',
    })
    @Transform(({ value }) => value ?? 'json')
    contentType?: Extension;
    } 

  1. 控制器:

 @Post('list')
 async list(@Body() list: ListDto): Promise<any> {
   try {
     console.log(list.sort) // <-- Expected default value defined in decorator, but undefined
     console.log(list.contentType) // <-- Expected default value defined in decorator, but undefined
     return await this.someService.list(list);
   } catch (error) {
    ....
   }
 }

  1. 请求正文:

    {
      "param1" : "Some value",
      "param2" : "Some other"
      //NOT Passing sort or contentType
    }

  1. 服务方法声明:

async list({
...more...
sort,
contentType,
}: ListeDto): Promise<List> {
console.log(contentType) <-- Expect to see the default value from the decorator, but undefined
console.log(sort)  <-- Expect to see the default value from the decorator, but undefined
...some implementation...
}

我哪里做错了? 或者我错过了什么?

javascript nestjs backend class-validator class-transformer
1个回答
0
投票

尝试用 OR

??
替换
||
Nullish 运算符,并像这样设置 prop 的默认值。

    export class ListDto {
    ... more...
        
      @Transform(({ value }) => value || 'json')
    contentType?: Extension = 'json';
    } 

© www.soinside.com 2019 - 2024. All rights reserved.