Validating User Input with class-validator Decorators in NestJS
📖 Scenario: You are building a simple user registration form in a NestJS backend. You want to ensure that the data sent by users is valid before processing it.
🎯 Goal: Create a User Data Transfer Object (DTO) class using class-validator decorators to validate user input fields like username, email, and age.
📋 What You'll Learn
Create a class called UserDto with properties username, email, and age.
Add validation decorators @IsString() and @Length(3, 20) to username.
Add validation decorators @IsEmail() to email.
Add validation decorators @IsInt(), @Min(18), and @Max(99) to age.
💡 Why This Matters
🌍 Real World
Validating user input is essential in web applications to prevent bad data and security issues. Using class-validator decorators in NestJS makes this easy and clean.
💼 Career
Backend developers working with NestJS often create DTOs with validation decorators to ensure data integrity and improve application reliability.
Progress0 / 4 steps
1
Create the UserDto class with properties
Create a class called UserDto with three properties: username of type string, email of type string, and age of type number.
NestJS
Hint
Define a class with three properties and their types exactly as specified.
2
Add validation decorators for username
Import IsString and Length from class-validator. Add the decorators @IsString() and @Length(3, 20) above the username property.
NestJS
Hint
Remember to import the decorators before using them.
3
Add validation decorator for email
Import IsEmail from class-validator. Add the decorator @IsEmail() above the email property.
NestJS
Hint
Use @IsEmail() to check if the email is valid.
4
Add validation decorators for age
Import IsInt, Min, and Max from class-validator. Add the decorators @IsInt(), @Min(18), and @Max(99) above the age property.
NestJS
Hint
Use these decorators to ensure age is an integer between 18 and 99.
Practice
(1/5)
1. What is the main purpose of @IsEmail() decorator in class-validator when used in a NestJS DTO class?
easy
A. To convert the property value to lowercase
B. To check if the property value is a valid email address format
C. To make the property optional
D. To trim whitespace from the property value
Solution
Step 1: Understand the decorator's role
The @IsEmail() decorator validates that the decorated property contains a valid email format string.
Step 2: Compare options with decorator behavior
Only To check if the property value is a valid email address format matches the validation purpose of @IsEmail(). Other options describe unrelated behaviors.
Final Answer:
To check if the property value is a valid email address format -> Option B
Quick Check:
@IsEmail() validates email format [OK]
Hint: Remember: @IsEmail() checks email format only [OK]
Common Mistakes:
Thinking @IsEmail() modifies the value instead of validating
Confusing @IsEmail() with @IsOptional() or @Transform decorators
2. Which of the following is the correct way to use @Length() decorator to require a string property to be between 5 and 10 characters in NestJS?
easy
A. @Length(5, 10)
B. @Length(10, 5)
C. @Length(min=5, max=10)
D. @Length({min:5, max:10})
Solution
Step 1: Recall the syntax of @Length decorator
The @Length() decorator takes two numeric arguments: minimum length first, then maximum length.
Step 2: Match options with correct syntax
@Length(5, 10) correctly uses @Length(5, 10). Options A, B, and D use incorrect argument order or syntax.
Final Answer:
@Length(5, 10) -> Option A
Quick Check:
@Length(min, max) = @Length(5, 10) [OK]
Hint: @Length(min, max) uses two numbers, min first [OK]
Common Mistakes:
Swapping min and max values
Using object syntax instead of positional arguments
Using named parameters which are invalid
3. Given this DTO class, what will be the validation result for username = 'abc' and age = 17?
Since price is string, validation will fail because @IsInt() requires a number. The type should be number.
Final Answer:
price should be a number type, not string -> Option A
Quick Check:
Type mismatch between property and decorators = error [OK]
Hint: Match property type with decorator expectations [OK]
Common Mistakes:
Using string type with number validators
Assuming decorators convert types automatically
Ignoring TypeScript type declarations
5. You want to validate a DTO property tags which is an array of strings, each string must be at least 3 characters. Which combination of class-validator decorators correctly enforces this?
hard
A. @IsString()\n@Length(3, 50)\n@IsArray()
B. @IsArray()\n@IsString()\n@Length(3, 50)
C. @IsArray()\n@ArrayMinSize(1)\n@IsString({ each: true })\n@Length(3, 50, { each: true })
D. @IsArray()\n@ArrayMaxSize(1)\n@IsString({ each: false })
Solution
Step 1: Validate the property is an array
Use @IsArray() to ensure tags is an array type.
Step 2: Validate each element is a string with length constraints
Use @IsString({ each: true }) and @Length(3, 50, { each: true }) to apply string and length validation to every item in the array.