Criando tarefas
Parte da seção TypeScript e NestJS do Journey de Node.js da Coddy. Lição 6 de 24.
Um cliente que cria uma tarefa a envia como JSON no corpo da requisição e precisa receber de volta a tarefa salva.
@Post()
create(@Body() review: { stars: number }) {
this.reviews.push(review);
return review;
}@Post() mapeia POST no caminho do controlador para o método, e @Body() fornece a ele o JSON analisado. O Nest lê os corpos JSON por conta própria, então não é necessário adicionar express.json().
O Nest responde a um POST com 201 Created, o status que indica que um novo recurso existe, e responde a todos os outros métodos com 200. @HttpCode(200) no método alteraria isso; para uma criação, deixe como está.
Desafio
FácilOs clientes precisam adicionar tarefas, não apenas lê-las. Adicione uma rota que crie uma tarefa a partir do JSON enviado pelo cliente.
- Em
src/tasks/tasks.controller.ts, adicione um método aTasksController(chame-o decreate) paraPOST /tasks. Marque-o com@Post()e leia o corpo JSON com@Body()no parâmetro. Ambos vêm de@nestjs/common. - Crie a nova tarefa a partir do
titledo corpo. Atribua a ela umidque nenhuma outra tarefa tenha: um a mais que o maior id emthis.tasks. Uma tarefa nova nunca está concluída, entãodoneéfalse. - Adicione a tarefa a
this.tasks, para queGET /taskseGET /tasks/:idpossam encontrá-la depois. Retorne a nova tarefa. - Não defina um status por conta própria. O Nest responde a um POST com 201 Created automaticamente.
Experimente: escolha POST, o caminho /tasks e o corpo { "title": "Buy milk" }. Você recebe 201 e:
{ "id": 4, "title": "Buy milk", "done": false }Envie GET /tasks/4: a mesma tarefa. Em seguida, envie um POST com o corpo vazio, {}. Ainda não há nenhuma validação do corpo, então você continua recebendo 201, com uma tarefa sem título: { "id": 5, "done": false }. O capítulo sobre validação corrige isso.
Experimente você mesmo
import { Controller, Get, Param, Query } 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(@Query('done') done?: string): Task[] {
if (done === undefined) {
return this.tasks;
}
return this.tasks.filter((task) => task.done === (done === 'true'));
}
@Get(':id')
findOne(@Param('id') id: string): Task | undefined {
return this.tasks.find((task) => task.id === Number(id));
}
}
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