Bird
Raised Fist0
NestJSframework~8 mins

Route handlers (GET, POST, PUT, DELETE) in NestJS - Performance & Optimization

Choose your learning style10 modes available
Performance: Route handlers (GET, POST, PUT, DELETE)
MEDIUM IMPACT
This affects server response time and client perceived latency by how efficiently route handlers process requests and send responses.
Handling HTTP requests with route handlers in NestJS
NestJS
import { Controller, Get } from '@nestjs/common';

@Controller('items')
export class ItemsController {
  @Get()
  async getAll() {
    // Asynchronous non-blocking operation
    const data = await this.fetchItemsFromDb();
    return { data };
  }

  async fetchItemsFromDb() {
    // Simulate async DB call
    return new Promise(resolve => setTimeout(() => resolve(['item1', 'item2']), 50));
  }
}
Using async/await avoids blocking the event loop, allowing other requests to be processed concurrently.
📈 Performance GainNon-blocking, reduces server response delay, improves INP metric.
Handling HTTP requests with route handlers in NestJS
NestJS
import { Controller, Get } from '@nestjs/common';

@Controller('items')
export class ItemsController {
  @Get()
  getAll() {
    // Synchronous heavy computation or blocking code
    for (let i = 0; i < 1e9; i++) {}
    return { data: 'All items' };
  }
}
Blocking synchronous code delays response, causing slow server replies and poor user experience.
📉 Performance CostBlocks event loop, increasing response time by hundreds of milliseconds or more.
Performance Comparison
PatternServer ProcessingEvent Loop BlockingResponse TimeVerdict
Synchronous blocking handlersHigh CPU usageBlocks event loopSlow responses[X] Bad
Asynchronous non-blocking handlersEfficient CPU usageNo blockingFast responses[OK] Good
Rendering Pipeline
Route handlers process incoming HTTP requests on the server, affecting how quickly responses are generated and sent back to the client. Slow or blocking handlers delay response generation, increasing interaction latency.
→Server Processing
→Network Response
→Client Rendering
⚠️ BottleneckServer Processing (event loop blocking or heavy synchronous work)
Core Web Vital Affected
INP
This affects server response time and client perceived latency by how efficiently route handlers process requests and send responses.
Optimization Tips
1Avoid synchronous blocking code in route handlers to keep the event loop free.
2Use async/await and non-blocking calls for database or heavy operations.
3Monitor server response times to detect slow route handlers affecting user experience.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance problem with synchronous blocking code in NestJS route handlers?
AIt causes layout shifts in the browser
BIt increases bundle size significantly
CIt blocks the event loop, delaying all other requests
DIt improves server throughput
DevTools: Network and Performance panels
How to check: Use Network panel to measure response times of API calls. Use Performance panel to record server response delays and event loop blocking.
What to look for: Look for long server response times and event loop blocking indicators that show slow route handler execution.

Practice

(1/5)
1. Which decorator is used in NestJS to create a route handler that responds to HTTP GET requests?
easy
A. @Get
B. @Post
C. @Put
D. @Delete

Solution

  1. Step 1: Understand HTTP methods and their decorators

    In NestJS, each HTTP method has a specific decorator: @Get for GET, @Post for POST, @Put for PUT, and @Delete for DELETE.
  2. Step 2: Match the decorator to the GET method

    The decorator @Get is specifically designed to handle HTTP GET requests.
  3. Final Answer:

    @Get -> Option A
  4. Quick Check:

    GET method uses @Get decorator [OK]
Hint: GET requests use @Get decorator in NestJS [OK]
Common Mistakes:
  • Confusing @Post or @Put with @Get
  • Using @Delete for GET requests
  • Not using any decorator
2. Which of the following is the correct syntax to define a POST route handler in a NestJS controller?
easy
A. @Post('/create') createItem() {}
B. Post('/create') createItem() {}
C. @post('/create') createItem() {}
D. @Put('/create') createItem() {}

Solution

  1. Step 1: Check the decorator syntax

    Decorators in NestJS start with '@' and are case-sensitive. The correct decorator for POST is '@Post'.
  2. Step 2: Verify the route path and method name

    The route path '/create' is correctly passed as a string argument, and the method name is valid.
  3. Final Answer:

    @Post('/create') createItem() {} -> Option A
  4. Quick Check:

    Correct decorator syntax uses '@Post' with parentheses [OK]
Hint: Decorators start with '@' and are case-sensitive [OK]
Common Mistakes:
  • Missing '@' before decorator
  • Using lowercase '@post' instead of '@Post'
  • Using wrong decorator like '@Put' for POST
3. Given the following NestJS controller code, what will be the HTTP method and route path to access the handler?
@Controller('users')
export class UserController {
  @Put(':id')
  updateUser() {
    return 'User updated';
  }
}
medium
A. GET /users/:id
B. DELETE /users/:id
C. PUT /users/:id
D. POST /users/:id

Solution

  1. Step 1: Identify the controller base path

    The @Controller('users') decorator sets the base route path to '/users'.
  2. Step 2: Identify the route handler method and path

    The @Put(':id') decorator means this handler responds to HTTP PUT requests at the path '/users/:id', where ':id' is a route parameter.
  3. Final Answer:

    PUT /users/:id -> Option C
  4. Quick Check:

    @Put with ':id' means PUT method at /users/:id [OK]
Hint: Decorator @Put means HTTP PUT method [OK]
Common Mistakes:
  • Confusing @Put with @Get or @Post
  • Ignoring the controller base path
  • Misreading ':id' as a literal string
4. What is wrong with this NestJS route handler code?
@Controller('items')
export class ItemController {
  @Delete('/remove')
  removeItem() {
    console.log('Item removed');
  }
}
medium
A. The method name must be 'deleteItem' for @Delete decorator
B. The decorator @Delete cannot have a path argument
C. The controller path 'items' is invalid
D. The method should return a value, not just console.log

Solution

  1. Step 1: Check the decorator and path usage

    @Delete can have a path argument like '/remove', so this is valid.
  2. Step 2: Check the method implementation

    The method only logs to console but does not return any response. HTTP handlers should return a response to the client.
  3. Final Answer:

    The method should return a value, not just console.log -> Option D
  4. Quick Check:

    Route handlers must return a response [OK]
Hint: Route handlers must return a response, not just log [OK]
Common Mistakes:
  • Assuming console.log sends response
  • Thinking decorator cannot have path
  • Believing method name must match decorator
5. You want to create a NestJS controller with a route handler that updates a product by its ID using HTTP PUT. The handler should accept the ID as a route parameter and the updated data in the request body. Which code snippet correctly implements this?
hard
A. @Put updateProduct(@Param('id') id: string, @Body() data: any) { return `Updated product ${id}`; }
B. @Put(':id') updateProduct(@Param('id') id: string, @Body() data: any) { return `Updated product ${id}`; }
C. @Put(':id') updateProduct(id: string, data: any) { return `Updated product ${id}`; }
D. @Post(':id') updateProduct(@Param('id') id: string, @Body() data: any) { return `Updated product ${id}`; }

Solution

  1. Step 1: Use the correct HTTP method and route parameter

    Updating a resource uses HTTP PUT, so @Put(':id') is correct to capture the ID as a route parameter.
  2. Step 2: Use parameter decorators to access route and body data

    @Param('id') extracts the ID from the route, and @Body() extracts the request body data. Both are required for this handler.
  3. Step 3: Check method signature and return

    The method correctly returns a string confirming the update with the ID.
  4. Final Answer:

    @Put(':id') updateProduct(@Param('id') id: string, @Body() data: any) { return `Updated product ${id}`; } -> Option B
  5. Quick Check:

    Use @Put with ':id' and @Param plus @Body [OK]
Hint: Use @Put(':id') with @Param and @Body for updates [OK]
Common Mistakes:
  • Missing route parameter in @Put decorator
  • Not using @Param or @Body decorators
  • Using wrong HTTP method like @Post for update
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