📖 Scenario: You are building a simple NestJS API to accept user registration data. You want to ensure the data is valid before processing it.
🎯 Goal: Build a NestJS controller that uses ValidationPipe to validate incoming user data with DTOs and class-validator decorators.
📋 What You'll Learn
Create a User DTO class with validation decorators
Set up a ValidationPipe instance with whitelist enabled
Use ValidationPipe in the controller to validate incoming data
Return the validated user data from the controller method
💡 Why This Matters
🌍 Real World
Validating user input in APIs is essential to prevent bad data and security issues. ValidationPipe helps automate this in NestJS.
💼 Career
Backend developers often use validation pipes to ensure data integrity and improve API reliability.
Progress0 / 4 steps
1
Create User DTO with validation decorators
Create a class called CreateUserDto with three properties: username (string, minimum length 3), email (string, must be an email), and age (number, minimum 18). Use class-validator decorators @IsString(), @MinLength(3), @IsEmail(), and @Min(18) as appropriate.
NestJS
Hint
Use class-validator decorators on each property to enforce the rules.
2
Configure ValidationPipe with whitelist
Create a constant called validationPipe that is a new instance of ValidationPipe with the option whitelist: true.
NestJS
Hint
Use new ValidationPipe({ whitelist: true }) to create the pipe.
3
Use ValidationPipe in controller method
Create a NestJS controller class called UserController with a method createUser that accepts a body parameter of type CreateUserDto. Use the @Body() decorator with the validationPipe to validate the input. The method should return the validated body.
NestJS
Hint
Use @Body(validationPipe) to apply validation on the input DTO.
4
Complete module setup with controller
Create a NestJS module class called UserModule that imports Module from '@nestjs/common' and declares the UserController in its controllers array.
NestJS
Hint
Use @Module({ controllers: [UserController] }) to declare the controller.
Practice
(1/5)
1. What is the main purpose of ValidationPipe in a NestJS application?
easy
A. To check and clean incoming data before it is used
B. To handle database connections automatically
C. To manage user authentication and sessions
D. To serve static files like images and CSS
Solution
Step 1: Understand ValidationPipe role
ValidationPipe is designed to validate and sanitize incoming request data to ensure it meets expected rules.
Step 2: Compare with other options
Options B, C, and D relate to other parts of NestJS or web apps, not data validation.
Final Answer:
To check and clean incoming data before it is used -> Option A
Quick Check:
ValidationPipe purpose = data validation [OK]
Hint: ValidationPipe = data check and clean before use [OK]
Common Mistakes:
Confusing ValidationPipe with authentication or database handling
Thinking ValidationPipe serves static files
Assuming ValidationPipe manages sessions
2. Which of the following is the correct way to enable automatic transformation of input data types using ValidationPipe in NestJS?
easy
A. new ValidationPipe({ forbidNonWhitelisted: true })
B. new ValidationPipe({ whitelist: true })
C. new ValidationPipe({ transform: true })
D. new ValidationPipe({ skipMissingProperties: true })
Solution
Step 1: Identify transform option
The transform: true option enables automatic conversion of input data types to expected types.
Step 2: Understand other options
whitelist removes unwanted properties, forbidNonWhitelisted throws error on extra props, skipMissingProperties skips validation for missing props.
Final Answer:
new ValidationPipe({ transform: true }) -> Option C
Quick Check:
transform option enables type conversion [OK]
Hint: Use transform: true to convert input types automatically [OK]
A. The ValidationPipe should have forbidNonWhitelisted to throw error on extra props
B. The whitelist option removes the extra property silently
C. The ValidationPipe is missing transform: true to convert types
D. The extra property causes a validation error
Solution
Step 1: Understand whitelist behavior
Whitelist removes properties not in DTO silently without error.
Step 2: Check how to throw error on extra props
To throw error on extra properties, forbidNonWhitelisted: true must be set.
Final Answer:
The ValidationPipe should have forbidNonWhitelisted to throw error on extra props -> Option A
Quick Check:
forbidNonWhitelisted throws error on extra props [OK]
Hint: Use forbidNonWhitelisted to reject extra properties with error [OK]
Common Mistakes:
Thinking whitelist throws error by default
Ignoring need for forbidNonWhitelisted option
Confusing whitelist with transform option
5. You want to ensure that your NestJS API only accepts properties defined in your DTO, automatically converts input types, and throws an error if extra properties are sent. Which ValidationPipe configuration achieves this?
hard
A. new ValidationPipe({ whitelist: true, transform: true })
B. new ValidationPipe({ whitelist: true, transform: true, forbidNonWhitelisted: true })
C. new ValidationPipe({ transform: true, skipMissingProperties: true })
D. new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true })
Solution
Step 1: Identify needed options
Whitelist removes extra props, transform converts types, forbidNonWhitelisted throws error on extra props.
Step 2: Match options to requirements
Only new ValidationPipe({ whitelist: true, transform: true, forbidNonWhitelisted: true }) includes all three: whitelist, transform, and forbidNonWhitelisted.
Final Answer:
new ValidationPipe({ whitelist: true, transform: true, forbidNonWhitelisted: true }) -> Option B