28-4 Création d'un service ProjetsService
Au même titre qu'en Angular où la logique applicative est généralement déléguée à un Service, Nest fait usage du même concept.
Le contrôleur reçoit la requête et, au besoin, délègue au service la logique applicative comme la communication avec la base de données.
Créer le service ProjetsService via le CLI
À l'aide du CLI de Nest, créez un service via la commande suivante:
nest g service projets
Le fichier suivant devrait avoir été créé:
src/projets/projets.service.ts
Normalement, vous n'avez pas à spécifier le chemin d'accès complet. Si vous créez un service projets, Nest comprendra qu'il doit le mettre dans le dossier projets.
Cependant, s'il s'agissait d'un service ayant un autre nom, mais qu'il doit être dans le dossier projets, il faudrait préciser le dossier.
Sans le module Projets, une référence au service devrait avoir été ajoutée via le tableau de providers:
@Module({
controllers: [ProjetsController],
providers: [ProjetsService]
})
export class ProjetsModule {}
Ajout de la liste de projets au service
Plutôt que de maintenir la liste en mémoire dans le contrôleur, déplaçons cette liste au niveau du service.
- Créez une propriété privée
projetscontenant la liste.src/projets/projets.service.tsexport class ProjetsService {
private timestamp = new Date().toJSON();
private projets = [
{
id: 1,
nom: 'LAN Party (NestJS API)',
description: 'Organiser le LAN Party',
image_url: 'https://i.imgur.com/Y5nZ4Qe.jpg',
date_creation: this.timestamp,
date_modification: this.timestamp,
},
{
id: 2,
nom: 'Discreddit (NestJS API)',
description: 'Projet de session',
image_url: 'https://i.imgur.com/Y5nZ4Qe.jpg',
date_creation: this.timestamp,
date_modification: this.timestamp,
},
];
} - Créez ensuite une fonction
obtenirTous()retournant la liste de projets en mémoire.src/projets/projets.service.tsobtenirTous() {
return this.projets;
}
Modifier le contrôleur pour utiliser le service
Modifiez maintenant le contrôleur afin que ce dernier utilise le service pour obtenir la liste de projets.
-
Injecter via son constructeur
ProjetsService. Le principe est le même qu'Angular!src/projets/projets.controller.ts@Controller('projets')
export class ProjetsController {
constructor(private projetsService: ProjetsService) {}
//...infoComme le service
ProjetsServiceutilise le décorateur@Injectable, il est possible de l'injecter dans une classe via le constructeur. Il s'agit du même mécanisme d'injection de dépendance qu'Angular.L'effet est donc de créer une propriété privée
projetsServicede typeProjetServicedans la classeProjetsController. -
Dans le contrôleur, il suffit de faire appel au service dans
findAll()afin d'obtenir la liste de projets et retourner cette dernière.src/projets/projets.controller.ts@Get()
findAll() {
return this.projetsService.obtenirTous();
}
Test via Postman
Effectuer la requête dans Postman (http://localhost:3000/projets) devrait vous donner le même résultat.
[
{
"id": 1,
"nom": "LAN Party (NestJS API)",
"description": "Organiser le LAN Party",
"imageUrl": "https://i.imgur.com/Y5nZ4Qe.jpg",
"date_creation": "2023-10-11T12:11:11.487Z",
"date_modification": "2023-10-11T12:11:11.487Z"
},
{
"id": 2,
"nom": "Discreddit (NestJS API)",
"description": "Projet de session",
"imageUrl": "https://i.imgur.com/Y5nZ4Qe.jpg",
"date_creation": "2023-10-11T12:11:11.487Z",
"date_modification": "2023-10-11T12:11:11.487Z"
}
]