Parâmetros de rota
Parte da seção TypeScript e NestJS do Journey de Node.js da Coddy. Lição 4 de 24.
Um cliente muitas vezes precisa de uma tarefa, não da lista inteira. Um caminho pode conter um parâmetro: uma parte que muda de uma requisição para outra.
@Get(':isbn')
findOne(@Param('isbn') isbn: string) {
return this.books.find((book) => book.isbn === isbn);
}:isbn corresponde a qualquer valor nessa parte do caminho, então GET /books/978 chega a esse método. @Param('isbn') passa esse valor para o método. Ele é sempre texto: /books/42 fornece a string '42', nunca o número 42.
Se você omitir o nome, @Param() fornece o objeto com todos os parâmetros, { isbn: '978' }, em vez do valor.
Desafio
FácilUm cliente geralmente quer uma tarefa, não a lista inteira. Adicione uma rota que retorne uma tarefa pelo seu id.
- Em
src/tasks/tasks.controller.ts, adicione um segundo método aTasksController(chame-o defindOne) paraGET /tasks/:id.:idrepresenta qualquer valor nessa posição do caminho, então/tasks/2chega até ele. - Leia o id do caminho com
@Param('id'). ImporteParamde@nestjs/common. - O id chega como texto, como
"2", mas os ids emthis.taskssão números, e"2" === 2é falso. Converta o id em número antes de compará-lo. - Retorne a tarefa com esse id.
- Deixe
GET /taskscomo está: ele ainda retorna a lista inteira.
Experimente: envie GET /tasks/2. Você recebe 200 e:
{ "id": 2, "title": "Fix the login bug", "done": false }Envie também GET /tasks/1 e GET /tasks/3. Depois, envie GET /tasks/99. Nenhuma tarefa tem esse id, então seu método não retorna nada, e o Nest responde com 200 e um corpo vazio. Por enquanto, esse é o comportamento esperado. Ele não informa nada ao cliente, e uma lição posterior corrige isso.
Experimente você mesmo
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 as lições de TypeScript e NestJS
1Fundamentos do Nest
Classes e métodosOlá, NestRegistrando um controller4Guardas, filtros e interceptadores
GuardasPratique por conta própria: Playground de Express