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.
Défi
FacileLes 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.
- Dans
src/tasks/tasks.controller.ts, ajoute une méthode àTasksController(appelle-lacreate) pourPOST /tasks. Marque-la avec@Post()et lis le corps JSON avec@Body()sur son paramètre. Les deux proviennent de@nestjs/common. - Construis la nouvelle tâche à partir du
titledu corps. Attribue-lui unidqui n'existe pour aucune autre tâche : un de plus que le plus grand id dansthis.tasks. Une nouvelle tâche n'est jamais terminée, doncdonevautfalse. - Ajoute la tâche à
this.tasks, afin queGET /tasksetGET /tasks/:idpuissent la retrouver par la suite. Renvoie la nouvelle tâche. - 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
1Les bases de Nest
Classes et méthodesBonjour, NestEnregistrer un contrôleur4Gardes, filtres, intercepteurs
GardesEntraînez-vous par vous-même : Playground Express