Response handling lets your server send back clear and useful answers to users or other programs. It helps show the right data or messages after someone asks for something.
Response handling in NestJS
import { Controller, Get, Res } from '@nestjs/common'; import { Response } from 'express'; @Controller('example') export class ExampleController { @Get() getExample(@Res() res: Response) { res.status(200).json({ message: 'Hello World' }); } }
Use @Res() decorator to get the raw response object from Express.
Call methods like status() and json() on the response to send data.
import { Controller, Get, Res } from '@nestjs/common'; import { Response } from 'express'; @Controller('hello') export class HelloController { @Get() sayHello(@Res() res: Response) { res.status(200).send('Hello NestJS'); } }
import { Controller, Get, Res } from '@nestjs/common'; import { Response } from 'express'; @Controller('json') export class JsonController { @Get() sendJson(@Res() res: Response) { res.status(201).json({ success: true, data: [1, 2, 3] }); } }
@Res(). NestJS handles the response automatically.import { Controller, Get } from '@nestjs/common'; @Controller('simple') export class SimpleController { @Get() getSimple() { return { message: 'Auto handled response' }; } }
This controller sends a JSON greeting message with status code 200 when you visit the '/greet' route.
import { Controller, Get, Res } from '@nestjs/common'; import { Response } from 'express'; @Controller('greet') export class GreetController { @Get() greetUser(@Res() res: Response) { const greeting = { message: 'Welcome to NestJS!' }; res.status(200).json(greeting); } }
Using @Res() means you must handle sending the response yourself.
If you return data directly without @Res(), NestJS sends the response automatically.
Always set the correct status code to help clients understand the result.
Response handling controls what your server sends back to users or clients.
You can use @Res() to customize the response fully or return data directly for automatic handling.
Setting status codes and response formats clearly improves communication with clients.
Practice
@Res() decorator in a controller method?Solution
Step 1: Understand the role of
The@Res()@Res()decorator gives direct access to the HTTP response object, allowing full control over the response.Step 2: Differentiate from other decorators
Other decorators like@Inject()inject services, and route decorators define paths, but@Res()is specifically for response handling.Final Answer:
To access and customize the HTTP response object directly -> Option CQuick Check:
@Res()= direct response control [OK]
- Confusing @Res() with service injection
- Thinking @Res() defines routes
- Assuming @Res() auto-serializes data
@Res() in NestJS?Solution
Step 1: Recall Express response methods
In NestJS,@Res()uses Express response methods. The correct way to set status and send JSON isres.status(201).json(...).Step 2: Identify incorrect method usage
sendStatussends status and ends response, so chaining.json()is invalid.res.json(201, ...)andres.statusCode(201)are not valid Express methods.Final Answer:
res.status(201).json({ message: 'Created' }); -> Option AQuick Check:
Set status then json = res.status(201).json(...) [OK]
- Using sendStatus then chaining json
- Passing status code as first json argument
- Using non-existent statusCode method
async getData(@Res() res) {
const data = { id: 1, name: 'NestJS' };
return res.status(202).json(data);
}Solution
Step 1: Analyze response status setting
The method callsres.status(202), so the HTTP status code will be 202 (Accepted).Step 2: Analyze response body sent
The method sends JSON data{ id: 1, name: 'NestJS' }with.json(data), so the body will contain this object.Final Answer:
Status 202 with body { id: 1, name: 'NestJS' } -> Option AQuick Check:
Status 202 + JSON data = Status 202 with body { id: 1, name: 'NestJS' } [OK]
- Assuming default 200 status instead of 202
- Thinking body is empty when using json()
- Confusing status codes with error codes
@Res():async sendResponse(@Res() res) {
res.json({ message: 'Hello' });
res.status(200);
}Solution
Step 1: Understand Express response flow
Callingres.json()sends the response immediately and ends it.Step 2: Analyze order of method calls
Callingres.status(200)afterres.json()has no effect because response is already sent.Final Answer:
Calling res.status after res.json causes no effect -> Option DQuick Check:
Set status before sending response [OK]
- Calling res.status after res.json
- Thinking res.json needs await
- Confusing res.sendStatus with res.json
Solution
Step 1: Check correct chaining of status and json
async getUser(@Res() res, @Param('id') id: string) { const user = await this.userService.findById(id); if (!user) { return res.status(404).json({ error: 'User not found' }); } return res.status(200).json(user); } correctly callsres.status(404).json(...)andres.status(200).json(...), chaining status and JSON response properly.Step 2: Identify errors in other options
async getUser(@Res() res, @Param('id') id: string) { const user = await this.userService.findById(id); if (!user) { res.json({ error: 'User not found' }).status(404); } else { res.json(user).status(200); } } callsres.json()beforeres.status(), which does not set status correctly. async getUser(@Res() res, @Param('id') id: string) { const user = await this.userService.findById(id); if (!user) { res.json({ error: 'User not found' }); res.status(404); } else { res.json(user); res.status(200); } } callsres.json()beforeres.status(), which does not set status correctly. async getUser(@Res() res, @Param('id') id: string) { const user = await this.userService.findById(id); if (!user) { res.sendStatus(404); } else { res.json(user); } } usesres.sendStatus(404)which sends response immediately but does not send JSON error message.Final Answer:
correctly sets status and sends JSON error or data -> Option BQuick Check:
Chain status and json for correct response [OK]
- Calling res.json before res.status
- Using res.sendStatus without JSON body
- Separating status and json calls without chaining
Ready to prove it?
Pass the test and this pattern moves unknown
