Aller au contenu principal

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.

  1. Dans le service ProjetsService, créez une fonction Obtenir(id: number) acceptant un identifiant id en paramètre. Cet identifiant sera un number.

    src/projets/projets.service.ts
    obtenir(id: number) {

    }
    info

    On utilise un number pour l'identifiant puisque par défaut les id de base de données sont des nombres entiers. On met ainsi les bases pour lorsqu'une base de données sera intégrée.

  2. Retourner l'identifiant demandé à l'aide la fonction find.

    src/projets/projets.service.ts
    obtenir(id: number) {
    const projet = this.projets.find((projet) => {
    return projet.id === id;
    });

    return projet;
    }
    info

    La fonction find sur un tableau accepte en argument une fonction exécutée pour chaque élément du tableau. La fonction doit retourner un résultat de condition true/false. Ici, on vérifie si l'identifiant du projet est égal au id reçu en paramètre.

    Lorsque la condition est remplie (true), l'élément du tableau correspondant est retourné. Dans le cas contraire, undefined est 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()

VerbeCheminAction du contrôleur
GET/projetsfindAll()
POST/projetscreate()
GET/projets/:idfindOne()
PUT/PATCH/projets/:idupdate()
DELETE/projets/:idremove()
  1. Créez une fonction findOne() dans le contrôleur

    src/projets/projets.controller.ts
    //...

    findOne() {

    }

    //...
  2. L'action répondra à l'action HTTP GET et acceptera un paramètre dynamique :id (ex.: /projets/2)

    src/projets/projets.controller.ts
    @Get(':id')
    findOne() {

    }
    info

    N'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.

  3. Transférer le paramètre dynamique id à la fonction via le décorateur @Param

    src/projets/projets.controller.ts
    @Get(':id')
    findOne(@Param('id') id: string) {

    }
    info

    Si 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')).

  4. Appeler le service pour obtenir le projet en fonction du id

    src/projets/projets.controller.ts
    @Get(':id')
    findOne(@Param('id') id: string) {
    const projet = this.projetsService.obtenir(+id);
    }
    info

    L'utilisation de + devant la variable id permet de convertir le string en number. En effet, comme le paramètre id provient de la route et donc d'un chemin d'URL (/projets/3), la valeur est au format string.

  5. 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.

src/projets/projets.controller.ts
@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
}