Desbloqueando el poder del streaming – CodesCode

Este artículo te guía en la construcción de una aplicación Node.js para subidas eficientes de datos a Amazon S3, incluyendo la configuración, integración y almacenamiento en la base de datos.

Cargar conjuntos masivos de datos en Amazon S3 puede resultar intimidante, especialmente cuando se trata de gigabytes de información. Sin embargo, existe una solución al alcance. Podemos revolucionar este proceso aprovechando las capacidades de transmisión de una aplicación Node.js TypeScript. La transmisión nos permite transferir datos sustanciales a AWS S3 con una eficiencia notable, todo mientras conservamos los recursos de memoria y garantizamos la escalabilidad. En este artículo, emprendemos un viaje para revelar los secretos del desarrollo de una aplicación Node.js TypeScript que carga sin problemas gigabytes de datos a AWS S3 utilizando la magia de la transmisión.

Configuración de la aplicación Node.js

Comencemos configurando un nuevo proyecto Node.js:

mkdir aws-s3-uploadcd aws-s3-uploadnpm init -y

Después, instale las dependencias necesarias:

npm install aws-sdk axiosnpm install --save-dev @types/aws-sdk @types/axios typescript ts-nodenpm install --save-dev @types/express @types/multer multer multer-s3

Configurando AWS SDK y Multer

En esta sección, configuraremos el AWS SDK para habilitar la comunicación con Amazon S3. Asegúrese de tener listas sus credenciales de AWS.

import { S3 } from 'aws-sdk';import multer from 'multer';import multerS3 from 'multer-s3';import { v4 as uuidv4 } from 'uuid';const app = express();const port = 3000;const s3 = new S3({  accessKeyId: 'TU_ID_DE_ACCESO_AWS',  secretAccessKey: 'TU_CLAVE_DE_ACCESO_SECRETA_AWS',  region: 'TU_REGION_AWS',});

También configuraremos Multer para manejar las cargas de archivos directamente a S3. Defina la configuración de almacenamiento y cree una instancia de middleware de carga.

const upload = multer({  storage: multerS3({    s3,    bucket: 'TU_NOMBRE_DE_BUCKET_S3',    contentType: multerS3.AUTO_CONTENT_TYPE,    acl: 'public-read',    key: (req, file, cb) => {      cb(null, `uploads/${uuidv4()}_${file.originalname}`);    },  }),});

Creación del endpoint de carga de archivos

Ahora, creemos un endpoint POST para manejar la carga de archivos:

app.post('/upload', upload.single('file'), (req, res) => {  if (!req.file) {    return res.status(400).json({ message: 'No se ha cargado ningún archivo' });  }  const uploadedFile = req.file;  console.log('Archivo cargado exitosamente. URL de S3:', uploadedFile.location);  res.json({    message: 'Archivo cargado exitosamente',    url: uploadedFile.location,  });});

Probando la aplicación

Para probar la aplicación, puede utilizar herramientas como Postman o cURL. Asegúrese de configurar la cabecera Content-Type a multipart/form-data e incluir un archivo en el cuerpo de la solicitud con el nombre de campo ‘file’.

Elección entre almacenamiento en base de datos y almacenamiento en la nube

Si se deben almacenar los archivos en una base de datos o en un bucket de S3 depende de su caso de uso y requisitos específicos. Aquí hay una breve descripción:

Almacenamiento en base de datos

  • Integridad de datos: Ideal para garantizar la integridad de los datos y la consistencia entre los datos estructurados y los archivos asociados, gracias a las transacciones ACID.
  • Seguridad: Proporciona mecanismos de control de acceso detallados, incluido el control de acceso basado en roles.
  • Tamaño de archivo: Adecuado para archivos de tamaño pequeño a mediano en términos de rendimiento y costo de almacenamiento.
  • Flujos de trabajo transaccionales: Útil para aplicaciones con transacciones complejas que involucran tanto datos estructurados como archivos.
  • Respaldo y recuperación: Facilita la inclusión de archivos en procesos de respaldo y recuperación de bases de datos.

Almacenamiento en bucket de S3

  • Escalabilidad: Perfecto para archivos grandes y almacenamiento eficiente de archivos, escalando a gigabytes, terabytes o petabytes de datos.
  • Rendimiento: Optimizado para un almacenamiento y recuperación rápidos de archivos, especialmente para archivos multimedia grandes o datos binarios.
  • Eficiencia de costo: Rentable para volúmenes grandes de datos en comparación con las bases de datos, con precios competitivos.
  • Simplicidad: Ofrece una gestión sencilla de archivos, versionado y compartición fácil a través de URL públicas o firmadas.
  • Casos de uso: Comúnmente utilizado para almacenar activos estáticos y entrega de contenido, y como un backend escalable para cargar archivos web y móviles.
  • Durabilidad y disponibilidad: Garantiza una alta durabilidad y disponibilidad de datos, adecuado para el almacenamiento de datos críticos.

Enfoque híbrido: En algunos casos, los metadatos y las referencias a los archivos se almacenan en una base de datos, mientras que los archivos reales se almacenan en un bucket de S3, combinando las fortalezas de ambos enfoques.

La elección debe estar alineada con las necesidades de tu aplicación, considerando factores como el tamaño del archivo, el volumen, los requisitos de rendimiento, la integridad de los datos, el control de acceso y las limitaciones presupuestarias.

Multer vs. Formidable: Cómo elegir el middleware adecuado para la carga de archivos

Cuando se construyen aplicaciones de Node.js con Express, es esencial elegir el middleware adecuado para la carga de archivos. Comparemos dos opciones populares: Multer y Formidable.

Multer con Express

  • Integración con Express: Se integra sin problemas con Express para una configuración y uso sencillos.
  • Capa de abstracción: Proporciona una abstracción de nivel superior para manejar la carga de archivos, reduciendo el código repetitivo.
  • Cadena de middleware: Se ajusta fácilmente a las cadenas de middleware de Express, lo que permite su uso selectivo en rutas o puntos finales específicos.
  • Validación de archivos: Admite validación de archivos incorporada, mejorando la seguridad y el control sobre el contenido cargado.
  • Carga de múltiples archivos: Maneja la carga de múltiples archivos en una sola solicitud de manera eficiente.
  • Documentación y comunidad: Cuenta con una extensa documentación y una comunidad activa.
  • Renombramiento de archivos y control de almacenamiento: Permite personalizar las convenciones de nomenclatura de archivos y la ubicación de almacenamiento.

Formidable con Express

  • Versatilidad: Funciona en diferentes entornos de servidores HTTP, no está limitado a Express, ofreciendo flexibilidad.
  • Streaming: Capaz de procesar secuencias de datos entrantes, ideal para manejar archivos enormes de manera eficiente.
  • Personalización: Proporciona un control granular sobre el proceso de análisis, compatible con lógica personalizada.
  • Dependencias mínimas: Mantiene tu proyecto liviano con dependencias externas mínimas.
  • Ampliamente adoptado: Una biblioteca bien establecida en la comunidad de Node.js.

Elige Multer y Formidable en función de los requisitos de tu proyecto y la familiaridad con las bibliotecas. Multer es excelente para una integración sin problemas con Express, validación incorporada y enfoque sencillo. Formidable es preferido cuando necesitas más personalización, versatilidad o capacidades de transmisión para archivos grandes.

Conclusión

En conclusión, este artículo ha demostrado cómo desarrollar una aplicación de Node.js TypeScript para cargar eficientemente conjuntos de datos grandes en Amazon S3 utilizando la transmisión. La transmisión es un enfoque eficiente en cuanto a memoria y escalable, especialmente al tratar con gigabytes de datos. Siguiendo los pasos descritos en esta guía, puedes mejorar tus capacidades de carga de datos y construir aplicaciones más robustas.


Leave a Reply

Your email address will not be published. Required fields are marked *