Search code examples
nestjsclass-validatorclass-transformer

transform value if falsy


I'm validating my DTOs with the class-validator package. I enabled the transformation via

app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
  }),
);

in my main.ts file as described in the docs

https://docs.nestjs.com/techniques/validation#transform-payload-objects

I have a optional configuration field in my DTO. This field should be transformed to an empty object if it doesn't exist. The transformation decorator is described here

https://docs.nestjs.com/techniques/serialization#transform

I was hoping to come up with this solution:

export class MyDTO {
  @IsObject()
  @IsOptional()
  @Transform(configuration => configuration || {})
  public configuration: object;
}

When I call my API route

@Post()
public create(@Body() myDTO: MyDTO): void {
  console.log(myDTO);
}

with an empty body, so without the field configuration my MyDTO instance is

{}

although I would expect it to be

{
    configuration: {}
}

What is wrong or what am I missing? I tried to debug the code and it never hits the transformation function. So the @Transform doesn't trigger.


Update

It seems I have to do this

@IsObject()
@IsOptional()
@Transform(configuration => configuration || {}) // will be used if the field exists
public configuration: object = {}; // will be used if the field doesn't exist

The initial value will be used if you pass in an empty body. The transformation only runs if you pass in the field but assign a value like null to it.


Solution

  • Gonna go ahead n put this here too: why not just let typescript manage the default value with setting the value like

    export class MyDTO {
      @IsObject()
      @IsOptional()
      public configuration: object = {};
    }
    

    That way, if you get a value, great, and if it isn't there, class-transform will put the correct value there.

    Looks like there is more discussion about solutions here.