Menu
CoddyTech

Créer des tâches

Fait partie de la section TypeScript et NestJS du Journey Node.js de Coddy. Leçon 6 sur 24.

Un client qui crée une tâche l’envoie au format JSON dans le corps de la requête et a besoin de récupérer la tâche enregistrée.

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

@Post() associe POST, sur le chemin du contrôleur, à la méthode, et @Body() lui transmet le JSON analysé. Nest lit les corps JSON automatiquement ; il n’y a donc pas de express.json() à ajouter.

Nest répond à une requête POST avec 201 Created, le statut qui indique qu’une nouvelle ressource existe, et à toutes les autres méthodes avec 200. @HttpCode(200) sur la méthode modifierait ce comportement ; pour une création, laisse-le tel quel.

challenge icon

Défi

Facile

Les clients doivent pouvoir ajouter des tâches, et pas seulement les lire. Ajoute une route qui crée une tâche à partir du JSON envoyé par le client.

  1. Dans src/tasks/tasks.controller.ts, ajoute une méthode à TasksController (appelle-la create) pour POST /tasks. Marque-la avec @Post() et lis le corps JSON avec @Body() sur son paramètre. Les deux proviennent de @nestjs/common.
  2. Construis la nouvelle tâche à partir du title du corps. Attribue-lui un id qui n'existe pour aucune autre tâche : un de plus que le plus grand id dans this.tasks. Une nouvelle tâche n'est jamais terminée, donc done vaut false.
  3. Ajoute la tâche à this.tasks, afin que GET /tasks et GET /tasks/:id puissent la retrouver par la suite. Renvoie la nouvelle tâche.
  4. Ne définis pas toi-même de statut. Nest répond automatiquement à un POST avec 201 Created.

Essaie : choisis POST, le chemin /tasks et le corps { "title": "Buy milk" }. Tu obtiens 201 et :

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

Envoie GET /tasks/4 : tu obtiens la même tâche. Envoie ensuite un POST avec un corps vide, {}. Rien ne vérifie encore le corps, donc tu obtiens toujours 201, avec une tâche sans titre : { "id": 5, "done": false }. Le chapitre sur la validation corrige cela.

Essayez vous-même

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

Toutes les leçons de TypeScript et NestJS

Entraînez-vous par vous-même : Playground Express