Création d'une API REST avec NestJS : Guide Complet

Dimitri Denis - Oct 28 - - Dev Community

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 {}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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);
  }
}
Enter fullscreen mode Exit fullscreen mode

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);
  }
}
Enter fullscreen mode Exit fullscreen mode

Validation des Données

Ajoutons la validation des données avec class-validator :

npm i class-validator class-transformer
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

.
Terabox Video Player