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.
Défi
FacileCette é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.
- Dans
src/tasks/tasks.service.ts, marquez la classeTasksServiceavec@Injectable(), de@nestjs/common. Nest pourra ainsi la créer et la fournir. - 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 dansthis.tasks), ce titre etdone: false. Elle ajoute la tâche àthis.taskset la renvoie. Le contrôleur appelle cette méthode avec le titre du corps de la requête pourPOST /tasks. - Écrivez une méthode
remove(id), oùidest un nombre. Si aucune tâche n’a cet id, elle doit renvoyer une réponse 404, commefindOne: appelez d’abordthis.findOne(id), qui déclenche une exception. Supprimez ensuite la tâche dethis.tasks. Elle ne renvoie rien. - Dans
src/tasks/tasks.module.ts, importezTasksServicedepuis./tasks.service, puis ajoutez une listeprovidersau module, à côté decontrollers, et ajoutez-yTasksService. Nest ne crée que les classes répertoriées à cet endroit par un module. - Dans
src/tasks/tasks.controller.ts, remplacez le commentaire à l’intérieur deTasksControllerpar un constructeur qui prend un paramètre, écritprivate readonly tasksService: TasksService. Nest voit le typeTasksServiceet fournit son instance du service. Les motsprivate readonlydevant 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.
}
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
1Les bases de Nest
Classes et méthodesBonjour, NestEnregistrer un contrôleur4Gardes, filtres, intercepteurs
GardesEntraînez-vous par vous-même : Playground Express