Introduction
NestJS est un framework Node.js structuré qui utilise TypeScript et les concepts de l'injection de dépendances. Il permet de créer des APIs maintenables à grande échelle. Contrairement à Express pur, NestJS impose une architecture modulaire inspirée d'Angular. Ce tutoriel vous guide pas à pas pour construire une API REST complète avec validation, services et guards. Vous apprendrez les patterns professionnels utilisés en production.
Prérequis
- Node.js 20+
- TypeScript avancé
- Connaissances de base en REST et SQL
- npm ou pnpm installé
Initialisation du projet
npm i -g @nestjs/cli
nest new nestjs-api-2026
cd nestjs-api-2026
npm install class-validator class-transformer @nestjs/configInitialisez un projet NestJS et installez les packages essentiels pour la validation et la configuration. Cela pose les fondations d'une architecture propre.
Configuration du point d'entrée
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
await app.listen(3000);
}
bootstrap();Activez le ValidationPipe global pour transformer et valider automatiquement les DTOs. C'est la base d'une API sécurisée et propre.
Création du module principal
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { UsersModule } from './users/users.module';
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true }), UsersModule],
})
export class AppModule {}Structurez l'application avec des modules isolés. ConfigModule est chargé globalement pour accéder aux variables d'environnement partout.
Création du contrôleur utilisateurs
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.usersService.create(createUserDto);
}
@Get()
findAll() {
return this.usersService.findAll();
}
}Le contrôleur gère uniquement les routes HTTP. La logique métier est déléguée au service via l'injection de dépendances.
Implémentation du service et DTO
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
@Injectable()
export class UsersService {
private users: any[] = [];
create(dto: CreateUserDto) {
const user = { id: Date.now(), ...dto };
this.users.push(user);
return user;
}
findAll() {
return this.users;
}
}Le service contient la logique métier. Les DTOs assurent la validation stricte des données entrantes.
Bonnes pratiques
- Toujours utiliser des DTOs avec class-validator
- Séparer clairement contrôleurs, services et repositories
- Utiliser des guards et interceptors pour la logique transversale
- Configurer les variables d'environnement via ConfigModule
- Écrire des tests unitaires pour chaque service
Erreurs courantes à éviter
- Oublier le décorateur @Injectable() sur les services
- Ne pas activer le ValidationPipe global
- Mélanger la logique métier dans les contrôleurs
- Ignorer la gestion des exceptions avec des filtres
Pour aller plus loin
Découvrez nos formations NestJS avancées pour maîtriser CQRS, microservices et tests d'intégration.