DTOs
Parte de la sección TypeScript y NestJS del Journey de Node.js de Coddy. Lección 13 de 24.
@Body() body: { title: string } describe el cuerpo en un solo lugar, y nada lo comprueba: { "title": 42 } pasa directamente. Un DTO, un objeto de transferencia de datos, es una clase que describe qué contiene el cuerpo de una solicitud.
export class CreateOrderDto {
customer: string;
express?: boolean;
}
@Post()
create(@Body() dto: CreateOrderDto) {
return this.ordersService.create(dto);
}express? marca un campo opcional. El controlador y el servicio comparten la clase, así que coinciden en la estructura.
Un DTO es una clase, no una interfaz, por una razón. Las interfaces se eliminan junto con los demás tipos cuando se ejecuta el código, mientras que una clase sigue existiendo. La validación de Nest lee las reglas escritas como decoradores, y los decoradores necesitan una clase. Esa es la siguiente lección.
Desafío
FácilAhora los clientes pueden crear una tarea que ya esté completada. Describe el cuerpo de POST /tasks con un DTO, una clase que enumera los campos que contiene el cuerpo de una solicitud, y pásalo hasta el servicio.
- En
src/tasks/dto/create-task.dto.ts, dale a la claseCreateTaskDtodos campos:title, una cadena, ydone, un booleano opcional. - En
src/tasks/tasks.controller.ts, cambia el métodocreate. El parámetro@Body()ahora tiene el tipoCreateTaskDtoen lugar de{ title: string }. Pasa el DTO completo al servicio, no solo el título. - En
src/tasks/tasks.service.ts, cambiacreatepara que reciba el DTO en lugar de un título. La nueva tarea obtiene sutitledel DTO y también sudone, ofalsecuando el cuerpo no tienedone. El id ycreatedAtfuncionan como antes.
Pruébalo: envía POST { "title": "Pay rent", "done": true } a /tasks. Obtendrás 201 y la nueva tarea, completada:
{ "id": 4, "title": "Pay rent", "done": true, "createdAt": "2026-10-30T09:15:00.000Z" }(createdAt muestra la hora de tu solicitud). Envía POST { "title": "Buy milk" }: obtendrás 201 con "done": false. Después, envía POST { "title": 42 }. Seguirás obteniendo 201 y se guardará "title": 42: el DTO describe el cuerpo, pero todavía no comprueba nada. En la próxima lección, Nest lo rechazará.
Pruébalo tú mismo
// Describe el cuerpo de POST /tasks: un título y done cuando el cliente lo envíe.
export class CreateTaskDto {}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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