Introduction
NestJS est un framework Node.js progressif qui permet de construire des applications backend scalables et maintenables. Dans cet article, nous allons créer une API REST complète en utilisant NestJS, en couvrant les concepts fondamentaux et les bonnes pratiques.
Prérequis
Node.js (version 14+)
npm ou yarn
Une connaissance basique de TypeScript
Installation et Configuration
Commençons par installer le CLI NestJS et créer un nouveau projet :
npm i -g @nestjs/cli
nest new api-rest-demo
cd api-rest-demo
Structure du Projet
NestJS utilise une architecture modulaire. Voici la structure de base de notre projet :
src/
├── app.module.ts
├── app.controller.ts
├── app.service.ts
├── main.ts
└── users/
├── users.module.ts
├── users.controller.ts
├── users.service.ts
└── dto/
└── create-user.dto.ts
Création d'un Module Users
Créons un module pour gérer les utilisateurs :
// users/users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
Définition des DTOs
Les DTOs (Data Transfer Objects) définissent la structure des données :
// users/dto/create-user.dto.ts
export class CreateUserDto {
readonly name: string;
readonly email: string;
readonly age: number;
}
Implémentation du Service
Le service contient la logique métier :
// users/users.service.ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
@Injectable()
export class UsersService {
private users = [];
create(createUserDto: CreateUserDto) {
const user = {
id: this.users.length + 1,
...createUserDto,
};
this.users.push(user);
return user;
}
findAll() {
return this.users;
}
findOne(id: number) {
return this.users.find(user => user.id === id);
}
}
Création du Contrôleur
Le contrôleur gère les routes et les requêtes HTTP :
// users/users.controller.ts
import { Controller, Get, Post, Body, Param } 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();
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.usersService.findOne(+id);
}
}
Validation des Données
Ajoutons la validation des données avec class-validator :
npm i class-validator class-transformer
Modifions notre DTO:
// users/dto/create-user.dto.ts
import { IsString, IsEmail, IsInt, Min, Max } from 'class-validator';
export class CreateUserDto {
@IsString()
readonly name: string;
@IsEmail()
readonly email: string;
@IsInt()
@Min(0)
@Max(120)
readonly age: number;
}
Configuration de l'Application
Dans main.ts, activons la validation :
// main.ts
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
Tests avec cURL
Voici comment tester notre API :
# Créer un utilisateur
curl -X POST http://localhost:3000/users \
-H "Content-Type: application/json" \
-d '{"name":"John Doe","email":"john@example.com","age":30}'
# Obtenir tous les utilisateurs
curl http://localhost:3000/users
# Obtenir un utilisateur spécifique
curl http://localhost:3000/users/1
Conclusion
Nous avons créé une API REST fonctionnelle avec NestJS, incluant :
Une architecture modulaire
La validation des données
Des endpoints REST standards
Une structure de projet claire et maintenable
Ressources Utiles
Documentation officielle NestJS
Guides NestJS
Techniques NestJS