NestJS you can have multiple controller classes using the same @Controller('/v1/users') path
NestJS you can absolutely have multiple controller classes using the same @Controller('/v1/users') path. NestJS will simply merge the routes defined in those controllers.
This is actually a good practice for large modules, because it helps split logic into smaller, more maintainable files.
Example
Controller 1 – users.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('/v1/users')
export class UsersController {
@Get()
getAllUsers() {
return 'Get all users';
}
}Controller 2 – user-profile.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
@Controller('/v1/users')
export class UserProfileController {
@Get(':id/profile')
getUserProfile(@Param('id') id: string) {
return `Profile of user ${id}`;
}
}Module
Both controllers must be registered in the same module.
@Module({
controllers: [UsersController, UserProfileController],
})
export class UsersModule {}Resulting Routes
HTTPRouteControllerGET/v1/usersUsersControllerGET/v1/users/:id/profileUserProfileController
NestJS internally builds the routing table and combines them automatically.
When this is useful
For example in a large API like yours (TestReach style APIs), you might split controllers like:
users.controller.ts
users-auth.controller.ts
users-admin.controller.ts
users-settings.controller.ts
All can share:
@Controller('/v1/users')
One Important Rule ⚠️
You must avoid duplicate routes.
Bad example:
@Controller('/v1/users')
export class AController {
@Get()
}
@Controller('/v1/users')
export class BController {
@Get()
}Both map to:
GET /v1/users
Then NestJS will throw a route conflict / override issue.
A Very Clean Pattern (Recommended)
Instead of repeating /v1/users everywhere:
@Controller('users')
and in main.ts
app.setGlobalPrefix('v1');
Then all routes become automatically:
/v1/users
Comments (0)
Login to leave a comment.