Menu
CoddyTech

Parámetros de ruta

Parte de la sección TypeScript y NestJS del Journey de Node.js de Coddy. Lección 4 de 24.

Un cliente suele necesitar una tarea, no la lista completa. Una ruta puede contener un parámetro: una parte que cambia de una solicitud a otra.

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

:isbn coincide con cualquier valor en esa parte de la ruta, así que GET /books/978 llega a este método. @Param('isbn') le pasa ese valor al método. Siempre es texto: /books/42 devuelve la cadena '42', nunca el número 42.

Si omites el nombre, @Param() devuelve el objeto con todos los parámetros, { isbn: '978' }, en lugar del valor.

challenge icon

Desafío

Fácil

Un cliente suele querer una sola tarea, no la lista completa. Añade una ruta que devuelva una tarea por su id.

  1. En src/tasks/tasks.controller.ts, añade un segundo método a TasksController (llámalo findOne) para GET /tasks/:id. :id representa cualquier valor en esa posición de la ruta, así que /tasks/2 llega a él.
  2. Lee el id de la ruta con @Param('id'). Importa Param de @nestjs/common.
  3. El id llega como texto, como "2", pero los id de this.tasks son números, y "2" === 2 es falso. Convierte el id en un número antes de compararlo.
  4. Devuelve la tarea con ese id.
  5. Deja GET /tasks tal como está: sigue devolviendo la lista completa.

Pruébalo: envía GET /tasks/2. Obtienes 200 y:

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

Envía también GET /tasks/1 y GET /tasks/3. Después, envía GET /tasks/99. Ninguna tarea tiene ese id, así que tu método no devuelve nada y Nest responde con 200 y un cuerpo vacío. Por ahora, esto es lo esperado. No le dice nada al cliente; una lección posterior lo corregirá.

Pruébalo tú mismo

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

Todas las lecciones de TypeScript y NestJS

Practica por tu cuenta: Playground de Express