Menu
CoddyTech

Parametri di route

Fa parte della sezione TypeScript e NestJS del percorso Node.js di Coddy. Lezione 4 di 24.

Spesso un client ha bisogno di un'attività, non dell'intero elenco. Un percorso può contenere un parametro: una parte che cambia da una richiesta all'altra.

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

:isbn corrisponde a qualsiasi valore in quella posizione del percorso, quindi GET /books/978 raggiunge questo metodo. @Param('isbn') passa quel valore al metodo. È sempre testo: /books/42 restituisce la stringa '42', mai il numero 42.

Se ometti il nome, @Param() restituisce l'oggetto con tutti i parametri, { isbn: '978' }, anziché il valore.

challenge icon

Sfida

Facile

Spesso un client vuole una sola attività, non l’intero elenco. Aggiungi una route che restituisca un’attività in base al suo id.

  1. In src/tasks/tasks.controller.ts, aggiungi un secondo metodo a TasksController (chiamalo findOne) per GET /tasks/:id. :id rappresenta qualsiasi valore in quella posizione del percorso, quindi /tasks/2 lo raggiunge.
  2. Leggi l’id dal percorso con @Param('id'). Importa Param da @nestjs/common.
  3. L’id arriva come testo, come "2", ma gli id in this.tasks sono numeri, e "2" === 2 è false. Converti l’id in un numero prima di confrontarlo.
  4. Restituisci l’attività con quell’id.
  5. Lascia GET /tasks così com’è: continua a restituire l’intero elenco.

Prova: invia GET /tasks/2. Ottieni 200 e:

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

Invia anche GET /tasks/1 e GET /tasks/3. Poi invia GET /tasks/99. Nessuna attività ha quell’id, quindi il tuo metodo non restituisce nulla e Nest risponde con 200 e un corpo vuoto. Per ora è previsto. Non fornisce informazioni al client, ma una lezione successiva risolve il problema.

Provalo tu

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;
    }
}

Tutte le lezioni di TypeScript e NestJS

Esercitati da solo: Playground Express