Menu
CoddyTech

Un service

Fait partie de la section TypeScript et NestJS du Journey Node.js de Coddy. Leçon 9 sur 24.

Le contrôleur détient lui-même les tâches, donc aucune autre partie de l’application ne peut y accéder. Les données et la logique appartiennent à un fournisseur : une classe que Nest crée et remet à quiconque la demande.

@Injectable()
export class BooksService {
    private books = [{ title: 'Dune' }];
}

@Controller('books')
export class BooksController {
    constructor(private readonly booksService: BooksService) {}
}

@Injectable() marque la classe, et le module la répertorie dans providers. Une classe la demande en la nommant dans son constructeur : c’est l’injection de dépendances. private readonly placé devant le paramètre est une forme abrégée de TypeScript : cela crée un champ this.booksService et y stocke ce que Nest transmet. Nest lit le type du paramètre, que le compilateur conserve pour les classes décorées, crée une instance pour le module qui la répertorie et transmet cette même instance à chaque classe du module qui la demande. Les données sont partagées, et un test peut fournir un faux à la place.

Cette leçon commence avec le contrôleur qui appelle déjà this.tasksService.

challenge icon

Défi

Facile

Cette étape ouvre le projet de suivi des tâches Nest préparé pour le cours, plutôt que les fichiers de votre projet de l’étape Status Codes and Errors (y compris src/tasks/tasks.controller.ts). Votre travail précédent reste dans sa propre leçon. Lisez les fichiers fournis avant de modifier src/tasks/tasks.service.ts. Cette copie contient les routes Nest pour les tâches, et le contrôleur est préparé pour déléguer à un service.

Les tâches se trouvent dans le contrôleur, donc aucune autre partie de l’application ne peut y accéder. Déplacez-les dans un service : une classe qui gère les tâches, que Nest crée une fois et fournit à chaque classe qui en fait la demande. Le contrôleur a déjà été réécrit pour appeler le service. Votre travail consiste à terminer le service et à relier les deux.

  1. Dans src/tasks/tasks.service.ts, marquez la classe TasksService avec @Injectable(), de @nestjs/common. Nest pourra ainsi la créer et la fournir.
  2. Dans la même classe, écrivez une méthode create(title). Elle construit une tâche avec le prochain id disponible (un de plus que le plus grand id dans this.tasks), ce titre et done: false. Elle ajoute la tâche à this.tasks et la renvoie. Le contrôleur appelle cette méthode avec le titre du corps de la requête pour POST /tasks.
  3. Écrivez une méthode remove(id), où id est un nombre. Si aucune tâche n’a cet id, elle doit renvoyer une réponse 404, comme findOne : appelez d’abord this.findOne(id), qui déclenche une exception. Supprimez ensuite la tâche de this.tasks. Elle ne renvoie rien.
  4. Dans src/tasks/tasks.module.ts, importez TasksService depuis ./tasks.service, puis ajoutez une liste providers au module, à côté de controllers, et ajoutez-y TasksService. Nest ne crée que les classes répertoriées à cet endroit par un module.
  5. Dans src/tasks/tasks.controller.ts, remplacez le commentaire à l’intérieur de TasksController par un constructeur qui prend un paramètre, écrit private readonly tasksService: TasksService. Nest voit le type TasksService et fournit son instance du service. Les mots private readonly devant un paramètre créent également un champ, this.tasksService, qui contient la valeur transmise. C’est le nom que les méthodes ci-dessous utilisent déjà.

Essayez : POST { "title": "Buy milk" } vers /tasks. Vous obtenez 201 et :

{ "id": 4, "title": "Buy milk", "done": false }

Envoyez GET /tasks : quatre tâches, avec Buy milk en dernier. Envoyez DELETE /tasks/4 : 204. Envoyez DELETE /tasks/99 : 404 avec "message": "Task 99 not found".

Essayez vous-même

import { NotFoundException } from '@nestjs/common';

export interface Task {
    id: number;
    title: string;
    done: boolean;
    createdAt?: string;
}

// Faites de cette classe un fournisseur que Nest peut injecter.
export class TasksService {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true, createdAt: '2026-01-05T09:00:00.000Z' },
        { id: 2, title: 'Fix the login bug', done: false, createdAt: '2026-01-06T14:30:00.000Z' },
        { id: 3, title: 'Plan the sprint', done: false, createdAt: '2026-01-07T08:15:00.000Z' },
    ];

    findAll(done?: string): Task[] {
        if (done === undefined) {
            return this.tasks;
        }
        return this.tasks.filter((task) => task.done === (done === 'true'));
    }

    findOne(id: number): Task {
        const task = this.tasks.find((task) => task.id === id);
        if (!task) {
            throw new NotFoundException(`Task ${id} not found`);
        }
        return task;
    }

    // Écrivez create(title) et remove(id) ici.
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de TypeScript et NestJS

Entraînez-vous par vous-même : Playground Express