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í.
Desafío
FácilLos 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.
- En
src/tasks/tasks.controller.ts, añade un método aTasksController(llámalocreate) paraPOST /tasks. Márcalo con@Post()y lee el cuerpo JSON con@Body()en su parámetro. Ambos provienen de@nestjs/common. - Construye la nueva tarea a partir del
titledel cuerpo. Asígnale unidque no tenga ninguna otra tarea: uno más que el id más grande dethis.tasks. Una tarea nueva nunca está completada, así quedoneesfalse. - Añade la tarea a
this.tasks, para queGET /tasksyGET /tasks/:idla encuentren después. Devuelve la nueva tarea. - 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
1Fundamentos de Nest
Clases y métodosHola, NestRegistro de un controlador4Guards, filtros e interceptores
GuardsPractica por tu cuenta: Playground de Express