¿Qué es la serialización y cómo se aplica en las APIs?
La serialización se refiere a la técnica de transformar datos antes de que un controlador los envíe al servicio o a una respuesta. Esta técnica es ampliamente utilizada en las APIs, ya sean REST o GraphQL, permitiendo la manipulación de los datos para excluir o agregar información según la necesidad.
¿Cómo activar la serialización en un proyecto?
Para usar la técnica de serialización, primero debes modificar el archivo main.typescript
. Desde la librería @nestjs/common
, junto con ValidationPipe
, debes incluir un interceptor llamado ClassSerializerInterceptor
. Posteriormente, configura la aplicación para que utilice este interceptor de manera global:
app.useGlobalInterceptors(
new ClassSerializerInterceptor(app.get(Reflector))
);
Este paso inicial configura el proyecto para que pueda aplicar serialización en cualquier parte de la aplicación.
¿Cómo excluir información sensible?
La exclusión de datos es crucial, especialmente para información sensible como contraseñas. Usando ClassTransformer
, puedes excluir campos como CREATED_AT
e UPDATED_AT
de las respuestas. A continuación, un ejemplo de cómo hacerlo en una entidad:
import { Exclude } from 'class-transformer';
class OrderItemEntity {
@Exclude()
createdAt: Date;
@Exclude()
updatedAt: Date;
}
Cuando el serializador está activo, estos campos se eliminan automáticamente de la respuesta, protegiendo así la información.
¿Cómo transformar o agregar nueva información?
Además de excluir datos, la serialización permite transformar los datos existentes o agregar nuevos campos con la ayuda del decorador @Expose
. Por ejemplo, si necesitas un array de productos más limpio, como en el caso de una orden, puedes usar @Expose
para crear un campo que procese y retorne la estructura deseada.
Ejemplo de transformación
import { Expose } from 'class-transformer';
class OrderEntity {
private items: OrderItemEntity[];
@Expose()
get products() {
return this.items?.filter(item => !!item)
.map(item => ({
...item.product,
quantity: item.quantity,
})) || [];
}
}
Este bloque de código asegura que sólo los datos necesarios, como los productos y su cantidad, se expongan de manera organizada.
Consideraciones al calcular campos dinámicamente
La técnica de serialización permite calcular campos dinámicamente. Sin embargo, es importante tener en cuenta el impacto en el rendimiento, especialmente cuando se trata de grandes volúmenes de datos. El cálculo de un total, por ejemplo, puede realizarse dentro de Node.js, pero para datos masivos es preferible delegar esos cálculos a una base de datos para evitar problemas de rendimiento.
Cálculo de un total de orden
Aquí un ejemplo de cómo implementar un cálculo de campo dinámico dentro de una entidad:
@Expose()
get total() {
return this.items?.filter(item => !!item)
.reduce((total, item) => total + item.product.price * item.quantity, 0) || 0;
}
Esta implementación depende de buenos hábitos de codificación y de optimización constante para asegurar que la API funcione de manera eficiente sin sobrecargar el servidor.
La serialización es una técnica poderosa cuando se aplica correctamente, asegurando que sólo la información relevante salga a la luz mientras mantiene la integridad y seguridad de los datos sensibles. ¡Practica implementando serialización en tus proyectos para profesionalizar la manipulación de datos en tus APIs!
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?