Building a Simple NestJS Controller with @Controller Decorator
📖 Scenario: You are creating a simple web server using NestJS. You want to organize your routes by creating a controller that handles HTTP requests for a specific path.
🎯 Goal: Build a NestJS controller class using the @Controller decorator to define a route prefix.
📋 What You'll Learn
Create a controller class named AppController
Use the @Controller decorator with the path 'app'
Add a method named getHello inside the controller
Use the @Get decorator on the getHello method with no path argument
Return the string 'Hello World!' from the getHello method
💡 Why This Matters
🌍 Real World
Controllers in NestJS organize routes and handle HTTP requests in web applications and APIs.
💼 Career
Understanding controllers and decorators is essential for backend development with NestJS, a popular Node.js framework.
Progress0 / 4 steps
1
Create the controller class
Create a class named AppController in your file.
NestJS
Hint
Use the class keyword followed by AppController and curly braces.
2
Add the @Controller decorator with path 'app'
Add the @Controller('app') decorator above the AppController class definition. Also import Controller from @nestjs/common.
NestJS
Hint
Remember to import Controller and place @Controller('app') right before the class.
3
Add a getHello method with @Get decorator
Import Get from @nestjs/common. Inside AppController, add a method named getHello decorated with @Get() that returns the string 'Hello World!'.
NestJS
Hint
Use @Get() above the method and return the exact string 'Hello World!'.
4
Complete the controller export
Ensure the AppController class is exported as default export by adding export default AppController; at the end of the file.
NestJS
Hint
Use export default AppController; at the end of the file to complete the export.
Practice
(1/5)
1. What is the main purpose of the @Controller decorator in NestJS?
easy
A. To define a service that handles business logic
B. To mark a class as a group of routes with a base path
C. To create a database connection
D. To style the HTML output of a component
Solution
Step 1: Understand the role of @Controller
The @Controller decorator 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 B
Quick Check:
@Controller = route group [OK]
Hint: Remember: @Controller groups routes under one path [OK]
Common Mistakes:
Confusing @Controller with @Injectable
Thinking it styles components
Assuming it manages database connections
2. Which of the following is the correct syntax to define a controller with base path 'users' in NestJS?
easy
A. @Controller = 'users'
export class UsersController {}
B. @Controller.users
export class UsersController {}
C. @Controller('users')
export class UsersController {}
D. @Controller path='users'
export class UsersController {}
Solution
Step 1: Recall correct decorator syntax
The @Controller decorator 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 C
Quick Check:
@Controller('path') syntax = @Controller('users')
export class UsersController {} [OK]
Hint: Use parentheses with string path in @Controller [OK]
Common Mistakes:
Using dot notation instead of parentheses
Assigning with equal sign instead of decorator call
Writing invalid decorator syntax
3. Given the following controller code, what is the full URL path to access the getAllUsers method?
@Controller('api')
export class UserController {
@Get('users')
getAllUsers() {
return 'List of users';
}
}
medium
A. /users
B. /users/api
C. /api/getAllUsers
D. /api/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 D
Quick Check:
Base + method path = /api/users [OK]
Hint: Combine @Controller and @Get paths for full URL [OK]
Common Mistakes:
Reversing base and method paths
Using method name as URL path
Ignoring base path in URL
4. Identify the error in this NestJS controller code:
A. Duplicate routes for the same path cause a conflict
B. Missing parentheses in @Get decorator
C. Controller path should be '/products' with a slash
D. Methods must return JSON objects, not strings
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 A
Quick Check:
Duplicate routes = conflict error [OK]
Hint: Avoid duplicate routes with same path in one controller [OK]
Common Mistakes:
Focusing on @Get parentheses instead of duplicate routes
Believing controller path needs leading slash
Assuming string return type is invalid
5. You want to create a controller that handles routes for both '/admin' and '/user' paths using a single class. Which approach correctly uses the @Controller decorator to achieve this?
hard
A. Create two separate controllers, one for 'admin' and one for 'user'
B. @Controller(['admin', 'user'])
export class MultiPathController {}
C. @Controller('admin,user')
export class MultiPathController {}
D. @Controller('admin')
@Controller('user')
export class MultiPathController {}
Solution
Step 1: Understand @Controller supports single base path
The @Controller decorator 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 A
Quick Check:
One controller per base path [OK]
Hint: Use separate controllers for different base paths [OK]
Common Mistakes:
Using array of strings in @Controller (not supported)
Applying multiple @Controller decorators on one class
Trying to combine multiple paths in one string
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.