28-6 Ajout de l'action findOne au contrôleur de projets
La prochaine étape est d'obtenir un seul projet de l'API. Par contre, avant de retourner ce projet, il faut être en mesure de filtrer notre liste de projets en mémoire pour n'obtenir qu'un seul résultat.
Ajout du support à ProjetsService pour obtenir un élément de la liste de projets
Nous n'avons pas encore de base de données, ce qui fait en sorte que si on veut retourner un résultat parmi la liste projets, il faut faire le filtre manuellement.
Pour ce faire, il est possible d'utiliser la fonction find sur la liste. find est une fonction native JavaScript disponible sur les tableaux.
-
Dans le service
ProjetsService, créez une fonctionObtenir(id: number)acceptant un identifiantiden paramètre. Cet identifiant sera unnumber.src/projets/projets.service.tsobtenir(id: number) {
}infoOn utilise un
numberpour l'identifiant puisque par défaut lesidde base de données sont des nombres entiers. On met ainsi les bases pour lorsqu'une base de données sera intégrée. -
Retourner l'identifiant demandé à l'aide la fonction
find.src/projets/projets.service.tsobtenir(id: number) {
const projet = this.projets.find((projet) => {
return projet.id === id;
});
return projet;
}infoLa fonction
findsur un tableau accepte en argument une fonction exécutée pour chaque élément du tableau. La fonction doit retourner un résultat de conditiontrue/false. Ici, on vérifie si l'identifiant du projet est égal auidreçu en paramètre.Lorsque la condition est remplie (
true), l'élément du tableau correspondant est retourné. Dans le cas contraire,undefinedest retourné.
Créer l'action de contrôleur findOne()
Afin d'obtenir un seul projet via l'API, il nous faudra définir une fonction dans le contrôleur répondant à la méthode HTTP GET et acceptant un paramètre (l'identifiant du projet). Selon la convention Nest, cette fonction s'appellera findOne()
| Verbe | Chemin | Action du contrôleur |
|---|---|---|
| GET | /projets | findAll() |
| POST | /projets | create() |
| GET | /projets/:id | findOne() |
| PUT/PATCH | /projets/:id | update() |
| DELETE | /projets/:id | remove() |
-
Créez une fonction
findOne()dans le contrôleursrc/projets/projets.controller.ts//...
findOne() {
}
//... -
L'action répondra à l'action HTTP
GETet acceptera un paramètre dynamique:id(ex.:/projets/2)src/projets/projets.controller.ts@Get(':id')
findOne() {
}infoN'oubliez pas que l'URL de base (
/projets) est défini au niveau du controlleur (@Controller('projets')) et donc, définir@Get(':id')défini une route/projets/:id. -
Transférer le paramètre dynamique
idà la fonction via le décorateur@Paramsrc/projets/projets.controller.ts@Get(':id')
findOne(@Param('id') id: string) {
}infoSi une action de contrôleur accepte un paramètre via le décorateur de route (
@Get(:id)), ce dernier peut être transféré à la fonction via le décorateur@Param(@Param('id')). -
Appeler le service pour obtenir le projet en fonction du
idsrc/projets/projets.controller.ts@Get(':id')
findOne(@Param('id') id: string) {
const projet = this.projetsService.obtenir(+id);
}infoL'utilisation de
+devant la variableidpermet de convertir le string ennumber. En effet, comme le paramètreidprovient de la route et donc d'un chemin d'URL (/projets/3), la valeur est au formatstring. -
Finalement, on retourne le projet trouvé. On gèrera l'erreur 404 plus bas.
src/projets/projets.controller.ts@Get(':id')
findOne(@Param('id') id: string) {
const projet = this.projetsService.obtenir(+id);
return projet;
}
Test Postman
Essayez les URLs suivantes via Postman
Vous devriez recevoir pour chacune de ces requêtes un projet individuel au format JSON.
Par contre, que se passe-t-il si on demande un projet qui n'existe pas? Par exemple /projets/3.
Une réponse vide est retournée avec le code 200 OK. Il serait préférable de retourner une erreur 404.
Gérer l'erreur 404
Si un projet n'est pas trouvé (undefined dans notre cas), il est possible de retourner une erreur 404 via le contrôleur en lançant l'exception NotFoundException. Le type NotFoundException est fourni par Nest, pas besoin de créer notre propre type d'erreur comme nous l'avons fait pour Angular.
@Get(':id')
findOne(@Param('id') id: string) {
const projet = this.projetsService.obtenir(+id);
if (!projet) throw new NotFoundException();
return projet;
}
Si vous tentez d'accéder à http://localhost:3000/projets/3, vous obtiendrez un code de retour 404 en plus de la réponse suivante au format JSON.
{
"message": "Not Found",
"statusCode": 404
}