Search code examples
nestjsclass-validator

NestJs class-validator accepts empty payload


I'm trying to create validator that accepts 2 values as strings (must exist, min/max length etc).

The issue I am facing is that when I POST empty payload the validation passes and TypeORM tries to insert null values and I end up with HTTP status 500.

When I POST with invalid payload the validation works properly.

I want to get proper validation errors as a response when payload is empty (existence of name property, min/max length etc...) ...

I tried adding various class annotations and global settings but no luck...

Global validation enabled:

app.useGlobalPipes(
    new ValidationPipe({
        whitelist: true,
        forbidNonWhitelisted: true,
        forbidUnknownValues: true,
        skipMissingProperties: false,   //Thought this would check for missing properties
        transform: true,
    }),
);

Entity:

@Entity('r_cat')
export class ResearchCategory {
[...]
    @PrimaryGeneratedColumn()
    id: number;

    @ApiProperty({
        description: 'Name of the category',
        example: 'Analytics, Integration',
    })
    @Column('text')
    @IsString()
    @ApiProperty()
    @Length(2, 30)
    @IsNotEmpty()
    @IsDefined()
    name: string;
[...]

My request object (DTO):

export class CreateResearchCategoryRequest extends PartialType(
    OmitType(ResearchCategory, ['created_at', 'updated_at', 'deleted_at'] as const),
) {}

Controller:

    @Post()
    public async create(
        @Req() req,
        @Body() researchCategory: CreateResearchCategoryRequest,
    ): Promise<ResearchCategory> {
        return await this.service.createNew(researchCategory, req.user);
    }

Solution

  • I'm not sure this is the correct way to create a DTO based on the repository class. The usage of the mapper is different from what you've done since Nest examples show is all based on another DTO class, not a repository class.

    However, I think the following snippet should work in your situation:

    export class CreateResearchCategoryRequest extends OmitType(
      ResearchCategory, ['created_at', 'updated_at', 'deleted_at'] as const
    ) {}