Menu
CoddyTech

Paramètres de route

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

Un client a souvent besoin d’une tâche, pas de la liste entière. Un chemin peut contenir un paramètre : une partie qui change d’une requête à l’autre.

@Get(':isbn')
findOne(@Param('isbn') isbn: string) {
    return this.books.find((book) => book.isbn === isbn);
}

:isbn correspond à n’importe quelle valeur à cet endroit du chemin, donc GET /books/978 appelle cette méthode. @Param('isbn') transmet cette valeur à la méthode. C’est toujours du texte : /books/42 donne la chaîne '42', jamais le nombre 42.

Si tu omets le nom, @Param() renvoie l’objet contenant tous les paramètres, { isbn: '978' }, au lieu de la valeur.

challenge icon

Défi

Facile

Un client souhaite souvent obtenir une seule tâche, et non toute la liste. Ajoute une route qui renvoie une tâche à partir de son identifiant.

  1. Dans src/tasks/tasks.controller.ts, ajoute une deuxième méthode à TasksController (appelle-la findOne) pour GET /tasks/:id. :id représente n’importe quelle valeur à cet emplacement du chemin ; /tasks/2 l’atteint donc.
  2. Lis l’identifiant dans le chemin avec @Param('id'). Importe Param depuis @nestjs/common.
  3. L’identifiant arrive sous forme de texte, comme "2", mais les identifiants dans this.tasks sont des nombres, et "2" === 2 est faux. Convertis l’identifiant en nombre avant de le comparer.
  4. Renvoie la tâche ayant cet identifiant.
  5. Laisse GET /tasks tel quel : il renvoie toujours la liste complète.

Essaie : envoie GET /tasks/2. Tu obtiens le code 200 et :

{ "id": 2, "title": "Fix the login bug", "done": false }

Envoie aussi GET /tasks/1 et GET /tasks/3. Envoie ensuite GET /tasks/99. Aucune tâche n’a cet identifiant, donc ta méthode ne renvoie rien, et Nest répond avec le code 200 et un corps vide. C’est normal pour le moment. Cela ne donne aucune information au client, et une leçon ultérieure corrigera cela.

Essayez vous-même

import { Controller, Get } from '@nestjs/common';

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

@Controller('tasks')
export class TasksController {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true },
        { id: 2, title: 'Fix the login bug', done: false },
        { id: 3, title: 'Plan the sprint', done: false },
    ];

    @Get()
    findAll(): Task[] {
        return this.tasks;
    }
}

Toutes les leçons de TypeScript et NestJS

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