Bird
Raised Fist0
NestJSframework~5 mins

Request body in NestJS

Choose your learning style10 modes available
Introduction

The request body holds data sent by a client to the server, often used to send information like form inputs or JSON data.

When a client submits a form with user details to create a new account.
When sending JSON data to update a user's profile information.
When uploading data like comments or messages to a server.
When an API client sends data to be processed or stored.
When you want to receive structured data from a client in a POST or PUT request.
Syntax
NestJS
import { Controller, Post, Body } from '@nestjs/common';

@Controller('example')
export class ExampleController {
  @Post()
  create(@Body() data: any) {
    return data;
  }
}

The @Body() decorator extracts the request body data.

You can type the data parameter to match the expected data shape.

Examples
This example shows how to type the request body to expect a name and age.
NestJS
import { Controller, Post, Body } from '@nestjs/common';

@Controller('users')
export class UsersController {
  @Post('create')
  createUser(@Body() userData: { name: string; age: number }) {
    return `User ${userData.name} is ${userData.age} years old.`;
  }
}
Here, the request body is expected to be a simple string message.
NestJS
import { Controller, Post, Body } from '@nestjs/common';

@Controller('messages')
export class MessagesController {
  @Post()
  saveMessage(@Body() message: string) {
    return `Message received: ${message}`;
  }
}
Sample Program

This controller handles POST requests to '/products/add'. It reads the product name and price from the request body and returns a confirmation string.

NestJS
import { Controller, Post, Body } from '@nestjs/common';

@Controller('products')
export class ProductsController {
  @Post('add')
  addProduct(@Body() product: { name: string; price: number }) {
    return `Added product: ${product.name} with price $${product.price}`;
  }
}
OutputSuccess
Important Notes

Always validate and sanitize request body data to keep your app safe.

Use DTOs (Data Transfer Objects) with classes and validation decorators for better structure.

Request body is usually used with POST, PUT, or PATCH HTTP methods.

Summary

The request body carries data sent from client to server.

Use @Body() decorator in NestJS to access this data.

Typing the body helps catch errors and improves code clarity.

Practice

(1/5)
1. In NestJS, which decorator is used to access the data sent in the request body?
easy
A. @Body()
B. @Param()
C. @Query()
D. @Headers()

Solution

  1. Step 1: Understand the purpose of decorators in NestJS

    Decorators like @Body(), @Param(), @Query(), and @Headers() extract different parts of the request.
  2. Step 2: Identify which decorator accesses the request body

    @Body() specifically extracts the data sent in the request body from the client.
  3. Final Answer:

    @Body() -> Option A
  4. Quick Check:

    Request body data = @Body() [OK]
Hint: Request body data always uses @Body() decorator [OK]
Common Mistakes:
  • Using @Param() to get body data
  • Confusing @Query() with @Body()
  • Trying to access body data without any decorator
2. Which of the following is the correct way to type the request body in a NestJS controller method?
easy
A. create(@Body: any data) {}
B. create(@Body data: any) {}
C. create(@Body() data: any) {}
D. create(@Body data) {}

Solution

  1. Step 1: Recall the syntax for decorators with typed parameters

    In NestJS, the decorator is followed by parentheses and the parameter is typed after the colon.
  2. Step 2: Check each option's syntax

    create(@Body() data: any) {} correctly uses @Body() with typed parameter 'data: any'. Options B, C, and D have syntax errors or missing parentheses.
  3. Final Answer:

    create(@Body() data: any) {} -> Option C
  4. Quick Check:

    Correct decorator syntax = create(@Body() data: any) {} [OK]
Hint: Always use parentheses with @Body() and type after colon [OK]
Common Mistakes:
  • Omitting parentheses after @Body
  • Placing type before parameter name
  • Not typing the parameter at all
3. Given this NestJS controller method, what will be the output if the client sends {"name": "Alice"} in the request body?
  @Post()
  create(@Body() data: { name: string }) {
    return `Hello, ${data.name}!`;
  }
medium
A. "Hello, null!"
B. "Hello, undefined!"
C. Error: data.name is not defined
D. "Hello, Alice!"

Solution

  1. Step 1: Understand the method behavior with typed body

    The method expects an object with a 'name' string property and returns a greeting using that name.
  2. Step 2: Analyze the input and output

    The client sends {"name": "Alice"}, so data.name is "Alice". The method returns "Hello, Alice!".
  3. Final Answer:

    "Hello, Alice!" -> Option D
  4. Quick Check:

    Input name "Alice" produces greeting "Hello, Alice!" [OK]
Hint: Match input keys to typed properties for correct output [OK]
Common Mistakes:
  • Assuming undefined if typing is missing
  • Expecting runtime error for missing type
  • Confusing property names in the body
4. Identify the error in this NestJS controller method:
  @Post()
  create(@Body data: { age: number }) {
    return `Age is ${data.age}`;
  }
medium
A. Return statement syntax error
B. Missing parentheses after @Body decorator
C. Incorrect type for data parameter
D. Method should be named differently

Solution

  1. Step 1: Check the decorator syntax

    @Body decorator requires parentheses even if empty, so it should be @Body()
  2. Step 2: Verify other parts of the method

    The type and return statement are correct; only the decorator syntax is wrong.
  3. Final Answer:

    Missing parentheses after @Body decorator -> Option B
  4. Quick Check:

    @Body() needs parentheses [OK]
Hint: Always write @Body() with parentheses, even if empty [OK]
Common Mistakes:
  • Omitting parentheses after @Body
  • Misplacing type annotation
  • Assuming method name causes error
5. You want to accept a request body with optional fields in NestJS. Which method signature correctly types the body to allow optional 'email' and required 'username' fields?
  @Post()
  create(???) {
    // method body
  }
hard
A. @Body() data: { username: string; email?: string }
B. @Body() data: { username?: string; email: string }
C. @Body() data: { username: string; email: string }
D. @Body() data: { username?: string; email?: string }

Solution

  1. Step 1: Understand optional and required fields in TypeScript types

    A question mark (?) after a property name means it is optional; absence means required.
  2. Step 2: Match the requirement to the type

    Username is required, so no '?'. Email is optional, so it has '?'. @Body() data: { username: string; email?: string } matches this.
  3. Final Answer:

    @Body() data: { username: string; email?: string } -> Option A
  4. Quick Check:

    Required username, optional email = @Body() data: { username: string; email?: string } [OK]
Hint: Use '?' after optional fields in type definitions [OK]
Common Mistakes:
  • Marking required fields as optional
  • Marking optional fields as required
  • Forgetting to use @Body() decorator
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