Menu
CoddyTech

Creación de tareas

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

Un cliente que crea una tarea la envía como JSON en el cuerpo de la solicitud y necesita recibir de vuelta la tarea guardada.

@Post()
create(@Body() review: { stars: number }) {
    this.reviews.push(review);
    return review;
}

@Post() asigna POST en la ruta del controlador al método, y @Body() le entrega el JSON analizado. Nest lee los cuerpos JSON por sí solo, así que no hay que añadir express.json().

Nest responde a un POST con 201 Created, el estado que indica que existe un recurso nuevo, y a todos los demás métodos con 200. @HttpCode(200) en el método lo cambiaría; para crear, déjalo así.

challenge icon

Desafío

Fácil

Los clientes necesitan añadir tareas, no solo leerlas. Añade una ruta que cree una tarea a partir del JSON que envía el cliente.

  1. En src/tasks/tasks.controller.ts, añade un método a TasksController (llámalo create) para POST /tasks. Márcalo con @Post() y lee el cuerpo JSON con @Body() en su parámetro. Ambos provienen de @nestjs/common.
  2. Construye la nueva tarea a partir del title del cuerpo. Asígnale un id que no tenga ninguna otra tarea: uno más que el id más grande de this.tasks. Una tarea nueva nunca está completada, así que done es false.
  3. Añade la tarea a this.tasks, para que GET /tasks y GET /tasks/:id la encuentren después. Devuelve la nueva tarea.
  4. No establezcas el estado tú mismo. Nest responde por sí solo a un POST con 201 Created.

Pruébalo: elige POST, la ruta /tasks y el cuerpo { "title": "Buy milk" }. Obtienes 201 y:

{ "id": 4, "title": "Buy milk", "done": false }

Envía GET /tasks/4: la misma tarea. Después, envía un POST con el cuerpo vacío, {}. Todavía no se comprueba el cuerpo, así que sigues obteniendo 201, con una tarea que no tiene título: { "id": 5, "done": false }. El capítulo sobre validación lo corrige.

Pruébalo tú mismo

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 las lecciones de TypeScript y NestJS

Practica por tu cuenta: Playground de Express