Enfoques para el Almacenamiento de Imágenes en Node.js con MySQL y NestJS
Cuando trabajamos con la subida y gestión de archivos en una aplicación web, podemos optar por diferentes enfoques para almacenarlos. Cada opción tiene sus ventajas y desventajas dependiendo de los requisitos del proyecto. A continuación, exploramos los principales métodos utilizados para almacenar imágenes en aplicaciones basadas en Node.js y MySQL con NestJS.
Enfoques para el Almacenamiento de Imágenes
Subir la imagen directamente a la base de datos
Se almacena la imagen en la base de datos en formato BLOB (Binary Large Object). Esto facilita la gestión de permisos y copias de seguridad, pero puede ralentizar el rendimiento de la base de datos si se manejan archivos grandes o numerosas solicitudes.Guardar el archivo en el sistema de archivos y almacenar solo la ruta en la base de datos
En este método, el archivo se guarda en el sistema de archivos del servidor, y en la base de datos solo se almacena la ruta donde se encuentra. Es más eficiente en términos de rendimiento, pero requiere un sistema de respaldo para evitar pérdidas de datos en caso de fallos del servidor.Subir la imagen a un servicio en la nube (ej. AWS S3, Google Cloud Storage, Firebase Storage, Cloudinary, etc.)
Este método delega el almacenamiento a un proveedor de servicios en la nube. Es ideal para escalabilidad y seguridad, pero puede implicar costos adicionales.
Requisitos
Para seguir este tutorial, necesitas:
- Node.js (un entorno de ejecución para JavaScript en el backend)
- MySQL (base de datos relacional para almacenar los metadatos de los archivos)
- NestJS (framework progresivo para aplicaciones de Node.js)
- Multer (middleware para la gestión de archivos en Node.js)
Instalación de NestJS
Para comenzar con NestJS, es necesario instalar su CLI (Command Line Interface). Sigue estos pasos para configurar tu entorno:
1️⃣ Instalar la CLI de NestJS
Ejecuta el siguiente comando para instalar la última versión de la CLI de NestJS de manera global:
npx @nestjs/cli@latest new
Si deseas instalarla de forma global en tu sistema, puedes utilizar:
npm install -g @nestjs/cli
2️⃣ Crear un Nuevo Proyecto en NestJS
Después de instalar la CLI, puedes generar un nuevo proyecto con el siguiente comando:
nest new nombre-del-proyecto
Durante la creación del proyecto, NestJS te preguntará qué gestor de paquetes deseas usar (npm, yarn o pnpm). Selecciona el que prefieras y espera a que se instalen las dependencias.
3️⃣ Moverse al Directorio del Proyecto
cd nombre-del-proyecto
4️⃣ Ejecutar la Aplicación NestJS
Para iniciar el servidor en modo desarrollo, ejecuta:
npm run start:dev
Por defecto, la aplicación se ejecutará en http://localhost:3000/.
5️⃣ Verificar la Instalación
Si todo ha funcionado correctamente, deberías ver el mensaje:
[Nest] 12345 - 🚀 Application is running on: http://localhost:3000/
¡Listo! Ahora tienes NestJS instalado y en funcionamiento. 🚀
Configuración de NestJS con Multer para la Carga de Archivos
Instalación de Dependencias
Antes de comenzar, instala las dependencias necesarias ejecutando:
npm install --save @nestjs/platform-express multer @nestjs/config
Generación del Controlador y Configuración en NestJS para Subir Archivos
En NestJS, podemos generar automáticamente un controlador utilizando la CLI de NestJS. A continuación, te explico los pasos para hacerlo correctamente.
1️⃣ Generar el Controlador
Ejecuta el siguiente comando en la terminal para generar un controlador llamado files:
nest generate controller files
Este comando creará un archivo en la carpeta src/files/ con la estructura básica de un controlador.
2️⃣ Modificar el Controlador para Subir Archivos
Abre el archivo generado en src/files/files.controller.ts y modifica el contenido para que maneje la carga de archivos con Multer.
import { Controller, Post, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
@Controller('files')
export class FilesController {
@Post('upload')
@UseInterceptors(FileInterceptor('file'))
uploadFile(@UploadedFile() file: Express.Multer.File) {
console.log(file);
return { message: 'Archivo subido exitosamente', file };
}
}
3️⃣ Modificar el app.module.ts para Incluir Multer
En NestJS, utilizamos el módulo MulterModule para configurar la subida de archivos. Se especifica un directorio de destino donde se almacenarán temporalmente los archivos.
import { Module } from '@nestjs/common';
import { MulterModule } from '@nestjs/platform-express';
import { FilesController } from './files/files.controller';
@Module({
imports: [
MulterModule.register({
dest: './files', // Carpeta donde se almacenarán los archivos
}),
],
controllers: [FilesController],
})
export class AppModule {}
4️⃣ Levantar el Servidor y Probar la API
Ejecuta el siguiente comando para iniciar el servidor:
npm run start
Luego, prueba la API usando Postman o cURL enviando una solicitud POST a http://localhost:3000/files/upload con un archivo adjunto en el campo file.
Ejemplo de cURL para Subir un Archivo
curl -X POST http://localhost:3000/files/upload -F "file=@ruta/del/archivo.jpg"
Si todo está bien configurado, deberías recibir una respuesta JSON con los detalles del archivo subido:
{
"message": "Archivo subido exitosamente",
"file": {
"fieldname": "file",
"originalname": "archivo.jpg",
"encoding": "7bit",
"mimetype": "image/jpeg",
"destination": "./files",
"filename": "a1b2c3d4e5.jpg",
"path": "files/a1b2c3d4e5.jpg",
"size": 12345
}
}
Referencias y Recursos Adicionales
Si quieres aprender más sobre la gestión de archivos en NestJS, consulta los siguientes enlaces:
📺 Video explicativo sobre la carga de archivos en NestJS:
🔗 https://youtu.be/GE7RjyO3w68📄 Documentación oficial de NestJS sobre subida de archivos:
🔗 https://docs.nestjs.com/techniques/file-upload📑 Guía detallada sobre NestJS y MySQL con carga de archivos:
🔗 https://arctype.com/blog/nestjs-mysql-tutorial-fileuploads/
Con este enfoque, ya tienes una base para gestionar la subida de archivos en NestJS utilizando Multer. 🚀