This NestJS controller uses Joi to check the data sent to the /users POST route. If the data is wrong, it sends an error. If it is correct, it returns a success message with the user data.
NestJS
import { Controller, Post, Body, BadRequestException } from'@nestjs/common';
import * as Joi from'joi';
const createUserSchema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
email: Joi.string().email().required(),
age: Joi.number().integer().min(0).optional(),
});
@Controller('users')
export class UsersController {
@Post()
createUser(@Body() body: any) {
const { error, value } = createUserSchema.validate(body);
if (error) {
throw new BadRequestException(error.details[0].message);
}
return { message: 'User created', user: value };
}
}
OutputSuccess
Important Notes
Always validate data before using it to avoid bugs and security issues.
Joi gives detailed error messages to help fix input problems.
You can combine Joi with NestJS pipes for automatic validation.
Summary
Joi helps check data shapes and rules simply.
Use Joi schemas to describe what data should look like.
Validate data early to keep your app safe and stable.
Practice
(1/5)
1. What is the main purpose of using Joi in a NestJS application?
easy
A. To style the user interface
B. To manage database connections
C. To handle HTTP routing
D. To validate and enforce rules on incoming data
Solution
Step 1: Understand Joi's role
Joi is a library used to define schemas that describe how data should look and to check if data matches those rules.
Step 2: Identify the correct purpose in NestJS
In NestJS, Joi is used to validate incoming data to ensure it meets expected formats and constraints before processing.
Final Answer:
To validate and enforce rules on incoming data -> Option D
Quick Check:
Joi = Data validation [OK]
Hint: Joi is for checking data shapes and rules [OK]
Common Mistakes:
Confusing Joi with database or routing tools
Thinking Joi styles UI elements
Assuming Joi manages server configuration
2. Which of the following is the correct way to define a Joi schema for a required string field named username?
easy
A. Joi.string().required()
B. Joi.number().required()
C. Joi.boolean().optional()
D. Joi.array().required()
Solution
Step 1: Identify the data type for username
A username is typically a string, so the schema should start with Joi.string().
Step 2: Make the field required
Adding .required() ensures the field must be present and not empty.
Final Answer:
Joi.string().required() -> Option A
Quick Check:
String + required = Joi.string().required() [OK]
Hint: Use Joi.string().required() for mandatory text fields [OK]
Common Mistakes:
Using wrong Joi types like number or boolean for strings
Forgetting to add .required() for mandatory fields
A. email should be Joi.email() instead of Joi.string().email
B. password should not be required
C. Missing parentheses after email() method
D. min(8) is invalid for strings
Solution
Step 1: Review the email field syntax
The email method in Joi is a function and must be called with parentheses: email().
Step 2: Identify the missing parentheses
The code uses Joi.string().email without parentheses, which is incorrect and will cause an error.
Final Answer:
Missing parentheses after email() method -> Option C
Quick Check:
Joi methods require () to execute [OK]
Hint: Always add () after Joi methods like email() [OK]
Common Mistakes:
Omitting parentheses on Joi method calls
Misunderstanding required() necessity
Thinking min() is invalid for strings
5. You want to validate a user object with name (required string), age (optional number, minimum 0), and email (required valid email). Which Joi schema correctly applies these rules?
hard
A. Joi.object({ name: Joi.string().required(), age: Joi.number().min(0), email: Joi.string().email().required() })
B. Joi.object({ name: Joi.string(), age: Joi.number().min(0).required(), email: Joi.string().email() })
C. Joi.object({ name: Joi.string().required(), age: Joi.number().min(1).optional(), email: Joi.string().email().required() })
D. Joi.object({ name: Joi.string().required(), age: Joi.number().min(0).required(), email: Joi.string().email().required() })
Solution
Step 1: Check each field's requirements
Name must be a required string, age is optional number with min 0, email is required valid email string.
Step 2: Match schema to requirements
Joi.object({ name: Joi.string().required(), age: Joi.number().min(0), email: Joi.string().email().required() }) matches all: name is required string, age is number with min 0 (optional by default), email is required email string.
Step 3: Verify other options
Joi.object({ name: Joi.string(), age: Joi.number().min(0).required(), email: Joi.string().email() }) makes age required and email optional, Joi.object({ name: Joi.string().required(), age: Joi.number().min(1).optional(), email: Joi.string().email().required() }) uses min(1) for age (wrong min), Joi.object({ name: Joi.string().required(), age: Joi.number().min(0).required(), email: Joi.string().email().required() }) makes age required (wrong).