Bird
Raised Fist0
NestJSframework~20 mins

Validation with Joi in NestJS - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Joi Validation Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What happens when a NestJS controller uses Joi validation and receives invalid data?

Consider a NestJS controller method that uses Joi to validate incoming request data. If the data does not match the Joi schema, what will be the behavior?

NestJS
import * as Joi from 'joi';

const schema = Joi.object({
  username: Joi.string().min(3).required(),
  age: Joi.number().integer().min(18).required()
});

// Assume this schema is used in a validation pipe in a controller method
AThe controller method runs normally but with undefined or default values for invalid fields.
BThe invalid fields are automatically corrected to default valid values and the method runs.
CThe request is rejected and a 400 Bad Request error is sent with validation error details.
DThe server crashes with an unhandled exception due to Joi validation failure.
Attempts:
2 left
💡 Hint

Think about how NestJS validation pipes handle schema validation failures.

📝 Syntax
intermediate
2:00remaining
Which Joi schema correctly validates an object with an optional email and a required password of at least 8 characters?

Choose the Joi schema that correctly matches the requirements:

  • email: optional, must be a valid email if present
  • password: required, string, minimum length 8
AJoi.object({ email: Joi.string().email().required(), password: Joi.string().min(8) })
BJoi.object({ email: Joi.string().email(), password: Joi.string().min(8).required() })
CJoi.object({ email: Joi.string().optional(), password: Joi.string().min(8).required() })
DJoi.object({ email: Joi.email().optional(), password: Joi.string().min(8).required() })
Attempts:
2 left
💡 Hint

Remember that by default fields are optional unless marked required.

🔧 Debug
advanced
2:00remaining
Why does this Joi validation schema cause a runtime error?

Examine the following Joi schema and identify the cause of the runtime error:

NestJS
const schema = Joi.object({
  name: Joi.string().min(3),
  age: Joi.number().integer().min(0),
  email: Joi.string().email().required(),
});
AThe schema object must be wrapped in Joi.object().keys() instead of Joi.object().
BThe min(3) on name is invalid because min only works on numbers.
CJoi.number().integer() is invalid syntax and causes the error.
DThe .required method is missing parentheses, so email is not marked required correctly.
Attempts:
2 left
💡 Hint

Check the syntax of method calls on Joi validators.

❓ state_output
advanced
2:00remaining
What is the output of this Joi validation result?

Given the schema and input below, what is the value of result.error after validation?

NestJS
const schema = Joi.object({
  username: Joi.string().alphanum().min(3).max(10).required(),
  password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')).required()
});

const input = { username: 'ab', password: '123' };

const result = schema.validate(input);
AAn error object indicating username is too short
BAn error object indicating both username and password are invalid
CAn error object indicating password pattern mismatch
Dnull (no error, validation passed)
Attempts:
2 left
💡 Hint

Check the username length and password pattern against the input.

🧠 Conceptual
expert
3:00remaining
How does Joi validation integrate with NestJS pipes for request validation?

Which statement best describes how Joi schemas are used within NestJS validation pipes to validate incoming requests?

AJoi schemas are passed to a custom validation pipe that runs validation and throws exceptions on failure, integrating with NestJS exception filters.
BNestJS automatically converts Joi schemas to class-validator decorators without extra code.
CJoi validation is only used on the client side and does not integrate with NestJS pipes.
DNestJS uses Joi schemas internally by default without needing to define validation pipes.
Attempts:
2 left
💡 Hint

Think about how validation pipes work and how Joi can be used in them.

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

  1. 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.
  2. 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.
  3. Final Answer:

    To validate and enforce rules on incoming data -> Option D
  4. 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

  1. Step 1: Identify the data type for username

    A username is typically a string, so the schema should start with Joi.string().
  2. Step 2: Make the field required

    Adding .required() ensures the field must be present and not empty.
  3. Final Answer:

    Joi.string().required() -> Option A
  4. 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
  • Confusing optional() with required()
3. Given this Joi schema:
const schema = Joi.object({ age: Joi.number().min(18).required() });
const result = schema.validate({ age: 16 });

What will result.error contain?
medium
A. No error, validation passes
B. An error indicating age must be at least 18
C. An error indicating age is missing
D. An error indicating age must be a string

Solution

  1. Step 1: Analyze the schema rules

    The schema requires age to be a number, at least 18, and required.
  2. Step 2: Check the input data

    The input has age: 16, which is less than the minimum 18.
  3. Step 3: Determine validation result

    Validation fails because 16 is below the minimum, so result.error contains a message about age being too low.
  4. Final Answer:

    An error indicating age must be at least 18 -> Option B
  5. Quick Check:

    Age 16 < 18 = validation error [OK]
Hint: Check min() rules against input values [OK]
Common Mistakes:
  • Assuming 16 passes min(18) validation
  • Confusing missing field error with min value error
  • Expecting string type error instead of number
4. Identify the error in this Joi schema definition:
const schema = Joi.object({
email: Joi.string().email,
password: Joi.string().min(8).required()
});
medium
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

  1. Step 1: Review the email field syntax

    The email method in Joi is a function and must be called with parentheses: email().
  2. Step 2: Identify the missing parentheses

    The code uses Joi.string().email without parentheses, which is incorrect and will cause an error.
  3. Final Answer:

    Missing parentheses after email() method -> Option C
  4. 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

  1. 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.
  2. 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.
  3. 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).
  4. Final Answer:

    Joi.object({ name: Joi.string().required(), age: Joi.number().min(0), email: Joi.string().email().required() }) -> Option A
  5. Quick Check:

    Required fields + optional age min 0 = Joi.object({ name: Joi.string().required(), age: Joi.number().min(0), email: Joi.string().email().required() }) [OK]
Hint: Required fields use .required(), optional omit it [OK]
Common Mistakes:
  • Making optional fields required by mistake
  • Using wrong min values for age
  • Forgetting to call email() with parentheses
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard