En esta lección aprenderemos a implementar la funcionalidad de carga de archivos PDF e imágenes para la creación de libros en nuestra aplicación. Utilizaremos Cloudinary como servicio de almacenamiento en la nube.
1. Configuración de Endpoints
Creación de Endpoints para Libros
Primero, vamos a configurar todos los endpoints necesarios para manejar los libros:
- Crear el archivo de endpoints:
books-endpoints.md
- Endpoint principal:
POST /books
para crear un nuevo libro - Configurar Postman con la URL correcta y método POST
2. Manejo de Errores
Implementación de Validación
Al intentar crear un libro inicialmente, podemos encontrar errores como:
- «uploadedBy is required» (Campo ‘subido por’ requerido)
- «pdf is required» (PDF requerido)
Solución de Errores
Para resolver estos problemas:
- Revisar el controlador de libros (
books-controller.js
) - Implementar manejo de errores similar al controlador de usuarios
- Agregar validaciones necesarias para todos los campos requeridos
javascript// Ejemplo de manejo de errores
if (!req.body.title) {
return res.status(400).json({ error: 'El título es requerido' });
}
3. Configuración de Cloudinary
Instalación de Dependencias
Necesitamos instalar los paquetes necesarios para Cloudinary:
bashnpm install cloudinary multer-storage-cloudinary
Variables de Entorno
Agregar las siguientes variables al archivo .env
:
envCLOUDINARY_CLOUD_NAME=tu_cloud_name
CLOUDINARY_API_KEY=tu_api_key
CLOUDINARY_API_SECRET=tu_api_secret
Obtener Credenciales de Cloudinary
- Acceder a Cloudinary: Ir a cloudinary.com
- Iniciar sesión en tu cuenta
- Copiar Cloud Name desde el dashboard
- Obtener API Key y API Secret desde la sección de APIs
4. Implementación de Carga de Archivos
Configuración del Controlador
Modificar el controlador de libros para:
- Aceptar múltiples formatos: PDF, DOC, DOCX
- Manejar imagen de portada: JPG, PNG
- Integrar con Cloudinary para almacenamiento
Campos del Formulario
El formulario debe incluir:
- title: Título del libro
- author: Autor
- description: Descripción
- category: Categoría (ej: ficción)
- price: Precio (ej: 9.99)
- tags: Etiquetas (como array)
- pdf: Archivo PDF (file)
- coverImage: Imagen de portada (file)
5. Pruebas con Postman
Configuración de la Petición
- Método: POST
- URL:
http://localhost:3000/books
- Content-Type:
multipart/form-data
- Body: Usar «form-data» en lugar de «raw»
Estructura de Datos
title: "Título del libro"
author: "Nombre del autor"
description: "Descripción del libro"
category: "fiction"
price: 9.99
tags: ["aventura", "drama"]
pdf: [seleccionar archivo PDF]
coverImage: [seleccionar archivo de imagen]
6. Solución de Problemas Comunes
Error: «upload.single is not a function»
- Causa: Configuración incorrecta de multer
- Solución: Verificar la importación y configuración de multer-storage-cloudinary
Error: «uploadedBy is required»
- Causa: Falta el ID del usuario que sube el archivo
- Solución: Asegurar que el middleware de autenticación agregue el usuario a la petición
Archivos de Prueba
Para testing, puedes:
- Buscar «sample PDF download» en Google
- Usar cualquier imagen como portada de prueba
- Verificar que los archivos se suban correctamente a Cloudinary
7. Verificación del Resultado
Confirmación de Carga Exitosa
Una vez configurado correctamente:
- Los archivos se suben a Cloudinary
- Se generan URLs públicas para acceso
- Los datos se guardan en la base de datos
- Se puede acceder a los archivos subidos mediante las URLs generadas
URLs de Cloudinary
- PDF: URL directa para descarga/visualización
- Imagen de portada: URL optimizada para mostrar en la interfaz
Conclusión
Con esta implementación tenemos un sistema completo de carga de archivos que:
- ✅ Maneja PDFs y documentos
- ✅ Procesa imágenes de portada
- ✅ Utiliza Cloudinary para almacenamiento seguro
- ✅ Incluye validación y manejo de errores
- ✅ Es fácil de probar con Postman
La funcionalidad está lista para integrarse con el frontend de la aplicación.