Menu
CoddyTech

Creare task

Fa parte della sezione TypeScript e NestJS del percorso Node.js di Coddy. Lezione 6 di 24.

Un client che crea un'attività la invia come JSON nel corpo della richiesta e ha bisogno di ricevere l'attività salvata.

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

@Post() associa POST al metodo sul percorso del controller, mentre @Body() gli passa il JSON analizzato. Nest legge autonomamente i corpi JSON, quindi non c'è bisogno di aggiungere express.json().

Nest risponde a una richiesta POST con 201 Created, lo stato che indica che esiste una nuova risorsa, e a ogni altro metodo con 200. @HttpCode(200) sul metodo lo cambierebbe; per una creazione, lascialo così.

challenge icon

Sfida

Facile

I client devono poter aggiungere attività, non solo leggerle. Aggiungi una route che crea un'attività usando i dati JSON inviati dal client.

  1. In src/tasks/tasks.controller.ts, aggiungi un metodo a TasksController (chiamalo create) per POST /tasks. Contrassegnalo con @Post() e leggi il corpo JSON con @Body() sul parametro. Entrambi provengono da @nestjs/common.
  2. Crea la nuova attività usando il title del corpo. Assegnale un id che nessun'altra attività ha: uno in più dell'id più grande in this.tasks. Una nuova attività non è mai completata, quindi done è false.
  3. Aggiungi l'attività a this.tasks, così che GET /tasks e GET /tasks/:id possano trovarla in seguito. Restituisci la nuova attività.
  4. Non impostare tu stesso uno stato. Nest risponde autonomamente a una POST con 201 Created.

Prova: scegli POST, il percorso /tasks e il corpo { "title": "Buy milk" }. Otterrai 201 e:

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

Invia GET /tasks/4: otterrai la stessa attività. Poi invia una POST con il corpo vuoto, {}. Per ora il corpo non viene controllato, quindi otterrai comunque 201 e un'attività senza titolo: { "id": 5, "done": false }. Il capitolo sulla convalida risolve questo problema.

Provalo tu

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

Tutte le lezioni di TypeScript e NestJS

Esercitati da solo: Playground Express