Menu
CoddyTech

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á.

challenge icon

Desafio

Fácil

Os clientes precisam adicionar tarefas, não apenas lê-las. Adicione uma rota que crie uma tarefa a partir do JSON enviado pelo cliente.

  1. Em src/tasks/tasks.controller.ts, adicione um método a TasksController (chame-o de create) para POST /tasks. Marque-o com @Post() e leia o corpo JSON com @Body() no parâmetro. Ambos vêm de @nestjs/common.
  2. Crie a nova tarefa a partir do title do corpo. Atribua a ela um id que nenhuma outra tarefa tenha: um a mais que o maior id em this.tasks. Uma tarefa nova nunca está concluída, então done é false.
  3. Adicione a tarefa a this.tasks, para que GET /tasks e GET /tasks/:id possam encontrá-la depois. Retorne a nova tarefa.
  4. 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

Pratique por conta própria: Playground de Express