Skip to content
Learni
View all tutorials
Backend

Comment développer une API REST professionnelle avec NestJS en 2026

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

terminal
npm i -g @nestjs/cli
nest new nestjs-api-2026
cd nestjs-api-2026
npm install class-validator class-transformer @nestjs/config

Initialisez 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

src/main.ts
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

src/app.module.ts
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

src/users/users.controller.ts
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

src/users/users.service.ts
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.