În timp ce ecosistemul Node.js oferă o multitudine de biblioteci flexibile (cum sunt Express sau Fastify), el a suferit istoric de o lipsă cronică de structură arhitecturală: fiecare echipă își organiza fișierele și straturile într-un mod diferit, rezultând adesea în baze de cod greu de întreținut și testat.
NestJS, creat de Kamil Myśliwiec, a rezolvat definitiv această problemă devenind framework-ul enterprise standard pentru backend-uri TypeScript. Inspirat profund din principiile de design ale Angular, NestJS oferă o arhitectură modulară out-of-the-box, un container de Inversare a Controlului (IoC) extrem de puternic și un ciclu de viață riguros compus din Middleware, Guards, Interceptors, Pipes și Exception Filters.
Pipeline-ul de Prelucrare a unei Cereri în NestJS
# [Incoming HTTP Request]
# │
# ▼
# [Global & Route Middleware] (ex: CORS, CookieParser, BodyParser)
# │
# ▼
# [Guards] (ex: AuthGuard, RolesGuard - Verificare drepturi de acces)
# │
# ▼
# [Interceptors - Pre-controller] (ex: Măsurare timp de execuție, Logging)
# │
# ▼
# [Pipes] (ex: ValidationPipe cu class-validator - Transformare & Validare DTO)
# │
# ▼
# [Controller Handler Method] ──► [Service Business Logic]
# │
# ▼
# [Interceptors - Post-controller] (ex: Mapare format răspuns JSON)
# │
# ▼
# [Exception Filters] (Dacă a apărut o eroare: transformare în cod HTTP RFC 7807)
# │
# ▼
# [Final HTTP Response]
Pilonii Tehnologici ai NestJS
| Element Arhitectural | Decorator TypeScript | Responsabilitate în Sistem |
|---|---|---|
| Module (@Module) | @Module({ controllers, providers, exports }) |
Organizează aplicația în domenii de afaceri decuplate (UserModule, OrderModule). |
| Controllers (@Controller) | @Controller('users'), @Get(':id') |
Răspund de rutarea cererilor HTTP și returnarea răspunsurilor către clienți. |
| Providers / Services | @Injectable() |
Încapsulează logica de business, accesul la date și integrarea cu terți (injectabili prin IoC). |
| Guards (@Injectable) | canActivate(context: ExecutionContext) |
Determină dacă o cerere are permisiunea să ajungă la controller (Autentificare & Autorizare). |
Controller și Service Tipizat în NestJS
// users.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';
export interface User { id: number; name: string; role: string; }
@Injectable()
export class UsersService {
private users: User[] = [{ id: 1, name: 'Alex Popa', role: 'ADMIN' }];
findAll(): User[] {
return this.users;
}
findOne(id: number): User {
const user = this.users.find(u => u.id === id);
if (!user) throw new NotFoundException(`Utilizatorul cu ID-ul ${id} nu există.`);
return user;
}
}
// users.controller.ts
import { Controller, Get, Param, ParseIntPipe, UseGuards } from '@nestjs/common';
import { UsersService, User } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
getAllUsers(): User[] {
return this.usersService.findAll();
}
@Get(':id')
getUserById(@Param('id', ParseIntPipe) id: number): User {
return this.usersService.findOne(id);
}
}