> Manuales > Manual de NestJS

Qué son los DTO (Data Transfer Object), por qué los necesitamos en las aplicaciones Nest. Cómo crear una clase DTO y utilizarla en un controlador de la aplicación.

Clases DTO en NestJS

En este artículo del Manual de Nest vamos a establecer la primera piedra para lo que luego serán las validaciones. Sin embargo, no vamos a dedicarnos todavía a validar nada, sino que vamos a crear un nuevo tipo de clase que nos permitirá más adelante establecer las reglas de validación. Se trata de las clases que implementan los DTO, son un concepto de las aplicaciones distribuidas que aplicaremos en Nest.

Qué es un DTO

DTO son las siglas de Data Transfer Object y no es más que un objeto que se transfiere por la red entre dos sistemas, típicamente usados en aplicaciones cliente/servidor y en las aplicaciones web modernas.

DTO no es un concepto específico de Nest framework, sino que lo tenemos en cualquier aplicación web que tenga dos sistemas que necesitan comunicarse entre sí, como en las aplicaciones frontend modernas, donde tenemos la parte del frontend, realizada muy habitualmente con un framework del estilo de Angular y la parte del backend, que podrías realizar en Nest o cualquer otro framework o lenguaje para programación del lado del servidor.

En las aplicaciones de Nest, que comúnmente se usan como clientes desde una aplicación frontend, el DTO sería el objeto JSON que se transfiere desde el cliente al servidor (o viceversa) para realizar la operativa necesaria para el funcionamiento de la aplicación.

Por ejemplo, cuando hacemos una consulta por el método POST, desde el cliente al backend en Nest para crear un elemento, se tiene que enviar el set de datos de aquello que se quiere crear. Ese set de datos es básicamente un objeto, transferido en formato JSON, al que llamamos DTO. También, al realizar una consulta desde la aplicación frontend hacia Nest, esa consulta devuelve un objeto con datos, que también sería un DTO.

En fin, cuando tenemos varios componentes que funcionan en un sistema distribuido, los datos que se envían para el trasiego de la información se denominan DTOs.

Por qué queremos definir un DTO en Nest

En Nest, con la intención de crear aplicaciones robustas, es útil tipar los datos que se van a enviar y recibir desde el frontend al backend, especificando qué propiedades tendrán los objetos DTO y de qué tipos.

Por lo tanto, en el lado de Nest tendremos una clase o interfaz con la definición del esquema del DTO que el frontend nos debe enviar cuando realice las solicitudes. Es importante esta definición del esquema con el tipo de datos del DTO, porque será el primer paso para conseguir validaciones elementales del cuerpo de las solicitudes.

Al final, lo que conseguiremos es automatizar mucho todo el proceso de la verificación de la información, ayudándonos de todas las herramientas que el framework nos ofrece. Una vez validado el DTO podemos proceder a usar los datos recibidos, para realizar las operaciones que el frontend nos esté solicitando.

Cómo crear un DTO en Nest

Un DTO no es más que una clase o interfaz que define los datos que debemos recibir para trabajar con una entidad.

El DTO se parece mucho a la interfaz que realizamos para poder tipar una entidad. Solo que en el caso de una inserción el dato que nos enviarán no contendrá el identificador, porque generalmente será un autonumérico generado por el sistema gestor de base de datos.

En Nest podemos crear una clase para poder usarla como DTO con el comando:

nest generate class products/dto/product.dto

Si lo prefieres, el shortcut para realizar esta clase podría ser el siguiente:

nest g cl products/dto/product.dto

Esto nos generará una clase con muy poco código, por lo que también podríamos haber creado el archivo a mano con un código como este:

export class ProductDto {}

También se generarán un archivo de pruebas unitarias, que para un DTO es totalmente innecesario, por lo que podrías usar el flag --no-spec, como sigue:

nest g cl products/dto/product.dto --no-spec

Ahora vamos a especificar los tipos de datos de nuestro DTO.

export class ProductDto {
  name: string;
  description: string;
  stock: number;
}

Cómo usar el DTO

En el controlador vamos a usar el DTO para que, cuando nos piden hacer una inserción, podamos decirle que el dato que se recibirá en el body de la request, será del tipo del DTO que acabamos de crear.

Entonces, nuestro método @Post, tendrá el siguiente código.

@Post()
@HttpCode(HttpStatus.NO_CONTENT)
createProduct(
  @Body() productDto: ProductDto,
) {
  this.productsService.insert(productDto);
}

Acabamos de usar la clase ProductDto como si fuera un tipo, por lo que no debemos olvidarnos de importarla.

import { ProductDto } from './dto/create-product.dto';

Conclusión sobre los DTO en aplicaciones Nest

Con este cambio no se ha producido ningún comportamiento en especial, ya que no estamos todavía realizando validaciones. Solamente hemos establecido el primer paso. Así que, de momento, simplemente hemos creado una nueva clase con unas propiedades y unos tipos, lo que nos ayudaría simplemente a mantener el tipado de los datos con los que vamos a trabajar, por lo que será en el fondo algo parecido a lo que habíamos conseguido por medio de una interfaz.

Lo importante es que hemos asentado las bases sobre el conceto de DTO, que vamos a usar mucho en lo sucesivo y, por supuesto, en todas las aplicaciones web que desarrollemos con el framework Nest. En el siguiente artículo ya nos meteremos de lleno con el ValidationPipe, el cual nos permitirá establecer las reglas de validación, que colocaremos con anotaciones dentro de la clase del DTO. Con ello comenzará a tener sentido todo lo que acabamos de ver ahora.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual