Validation
DTOs
Define validation rules using class-validator decorators on plain classes.
import { IsString, IsEmail, IsOptional, MinLength } from "class-validator";
export class CreateUserDto { @IsString() @MinLength(2) name: string;
@IsEmail() email: string;
@IsOptional() @IsString() bio?: string;}Usage in Controllers
Pass the DTO class to @Body() to trigger automatic validation.
@Controller("/users")export class UserController { @Post("/") create(@Body(CreateUserDto) dto: CreateUserDto) { // dto is already validated and transformed return { created: dto }; }}What Happens
plainToInstance(CreateUserDto, body)— converts raw JSON to class instancevalidate(instance)— runs all class-validator decorators- If validation fails, throws
ValidationErrorBag(caught by error handler) - On success, the validated DTO is passed to the controller
Error Response
Validation errors return a 400 response:
{ "error": "Validation failed", "details": [ { "property": "email", "constraints": { "isEmail": "email must be an email" } } ]}Query Validation
@Get("/search")search(@Query(SearchDto) query: SearchDto) { return { results: [...] };}