Discover how a simple decorator can turn messy route handling into clean, organized code!
Why Controller decorator in NestJS? - Purpose & Use Cases
Imagine building a web server where you have to write code to listen to every URL path manually and then decide what to do for each request.
You have to check the URL, method, and then call the right function yourself.
This manual approach is slow and confusing.
It's easy to make mistakes like mixing up URLs or forgetting to handle some HTTP methods.
As your app grows, the code becomes messy and hard to maintain.
The Controller decorator in NestJS lets you group related routes in one place.
You just decorate a class and its methods to automatically handle requests for specific URLs and HTTP methods.
This keeps your code clean, organized, and easy to understand.
if (req.url === '/users' && req.method === 'GET') { getUsers(); } else if (req.url === '/users' && req.method === 'POST') { createUser(); }
@Controller('users') class UserController { @Get() getUsers() {} @Post() createUser() {} }
You can build scalable, readable web servers where routes are clearly grouped and easy to manage.
Think of an online store backend where all product-related routes like listing, adding, or deleting products are neatly organized in one controller class.
Manual routing is error-prone and hard to maintain.
Controller decorator groups routes in a clean, organized way.
It makes your server code easier to read and scale.
Practice
@Controller decorator in NestJS?Solution
Step 1: Understand the role of @Controller
The@Controllerdecorator marks a class as a handler for HTTP requests grouped under a base path.Step 2: Differentiate from other decorators
It is not used for services, database, or styling but specifically for routing.Final Answer:
To mark a class as a group of routes with a base path -> Option BQuick Check:
@Controller = route group [OK]
- Confusing @Controller with @Injectable
- Thinking it styles components
- Assuming it manages database connections
Solution
Step 1: Recall correct decorator syntax
The@Controllerdecorator takes the base path as a string argument inside parentheses.Step 2: Check each option's syntax
Only @Controller('users') export class UsersController {} uses the correct syntax:@Controller('users'). Others misuse dot, equal sign, or invalid syntax.Final Answer:
@Controller('users') export class UsersController {} -> Option CQuick Check:
@Controller('path') syntax = @Controller('users') export class UsersController {} [OK]
- Using dot notation instead of parentheses
- Assigning with equal sign instead of decorator call
- Writing invalid decorator syntax
getAllUsers method?
@Controller('api')
export class UserController {
@Get('users')
getAllUsers() {
return 'List of users';
}
}Solution
Step 1: Identify base path from @Controller
The base path is 'api' from@Controller('api').Step 2: Identify route path from @Get decorator
The method route is 'users' from@Get('users').Step 3: Combine base and method paths
Full path is base + method = '/api/users'.Final Answer:
/api/users -> Option DQuick Check:
Base + method path = /api/users [OK]
- Reversing base and method paths
- Using method name as URL path
- Ignoring base path in URL
@Controller('products')
export class ProductController {
@Get()
getAll() {
return 'All products';
}
@Get('')
getEmpty() {
return 'Empty route';
}
}Solution
Step 1: Analyze route paths from @Get decorators
Both methods respond to the same route: base 'products' + '' or no path means '/products'.Step 2: Understand route conflict
Having two methods for the same route causes a conflict and runtime error.Final Answer:
Duplicate routes for the same path cause a conflict -> Option AQuick Check:
Duplicate routes = conflict error [OK]
- Focusing on @Get parentheses instead of duplicate routes
- Believing controller path needs leading slash
- Assuming string return type is invalid
@Controller decorator to achieve this?Solution
Step 1: Understand @Controller supports single base path
The@Controllerdecorator accepts a single string as the base path. It does not support multiple paths in an array.Step 2: Evaluate options for multiple paths
Create two separate controllers, one for 'admin' and one for 'user' is correct because creating two separate controllers is the proper way to handle multiple base paths. @Controller(['admin', 'user']) export class MultiPathController {} is invalid syntax. @Controller('admin,user') export class MultiPathController {} uses a comma-separated string which is treated as a single path. @Controller('admin') @Controller('user') export class MultiPathController {} uses multiple decorators which is invalid.Final Answer:
Create two separate controllers, one for 'admin' and one for 'user' -> Option AQuick Check:
One controller per base path [OK]
- Using array of strings in @Controller (not supported)
- Applying multiple @Controller decorators on one class
- Trying to combine multiple paths in one string
Ready to prove it?
Pass the test and this pattern moves unknown
