Gestión de Productos - Backend

Aplicación web backend desarrollada con Node.js y Express para gestión de productos de tienda en línea. Implementa persistencia de datos, manejo de archivos, rutas dinámicas y servidor web completo.

Node.js Express EJS fs Module npm Multer
Ver Código Volver a Proyectos
Gestión de Productos

Descripción del Proyecto

Este proyecto es una aplicación web backend desarrollada como parte del Bootcamp de JavaScript, enfocada en la gestión de productos para una tienda en línea. La aplicación implementa un servidor Express completo con persistencia de datos, manejo de archivos y rutas dinámicas, cumpliendo con todos los requisitos del proyecto original.

Objetivos del Proyecto Original
  • Crear un servidor Express básico que sirva contenido estático y dinámico
  • Implementar persistencia de productos en archivos JSON utilizando fs
  • Desarrollar rutas para mostrar y agregar productos a través de formularios
  • Configurar manejo de errores básico en el servidor
  • Gestionar dependencias con npm y documentar el proceso
  • Demostrar funcionamiento correcto con pruebas de almacenamiento y lectura

Características Principales

1
Servidor Express

Servidor web básico que sirve contenido estático y dinámico, configurado para escuchar en puerto 3000.

2
Persistencia de Datos

Almacenamiento de productos en archivos JSON utilizando el módulo fs de Node.js de manera asíncrona.

3
Rutas Dinámicas

Rutas para mostrar productos y agregar nuevos productos a través de formularios con EJS.

4
Gestión de Dependencias

Uso de npm para instalar y gestionar dependencias como Express, EJS, Multer y nodemon.

5
Manejo de Errores

Middleware para capturar errores 404 y errores generales del servidor con mensajes apropiados.

6
Manejo de Archivos

Sistema de subida de imágenes con Multer y validación de tipos de archivo permitidos.

Arquitectura y Tecnologías

Backend Core

  • Node.js: Runtime de JavaScript para servidor
  • Express.js: Framework web minimalista y flexible
  • fs Module: Módulo nativo para manejo de archivos
  • EJS: Motor de plantillas para renderizado
  • JSON: Formato de persistencia de datos

Dependencias y Herramientas

  • npm: Gestor de paquetes y dependencias
  • Multer: Middleware para manejo de archivos
  • nodemon: Reinicio automático del servidor
  • body-parser: Parsing de datos de formularios
  • Middleware: Manejo de errores y rutas

Código Destacado

Configuración del Servidor

Configuración del Servidor Express
¿Qué se hizo?

Se configuró un servidor Express básico que escucha en el puerto 3000, con middleware para parsing de datos y configuración de EJS como motor de plantillas.

¿Por qué?

Express es el framework web más popular para Node.js, proporcionando una base sólida para crear aplicaciones web con rutas, middleware y manejo de requests/responses.

¿Para qué sirve?

Permite crear un servidor web que puede manejar peticiones HTTP, servir contenido estático y dinámico, y procesar formularios de usuarios.

Persistencia con fs

Persistencia con fs
¿Qué se hizo?

Se implementaron funciones asíncronas para leer y escribir productos en un archivo JSON usando el módulo fs de Node.js, con manejo de errores para archivos inexistentes.

¿Por qué?

El módulo fs permite operaciones de archivos de forma asíncrona, evitando bloquear el hilo principal del servidor. JSON es un formato ligero y fácil de manipular.

¿Para qué sirve?

Garantiza que los datos de productos se mantengan persistentes entre reinicios del servidor, permitiendo almacenar y recuperar información de manera confiable.

Rutas Express

Rutas Express
¿Qué se hizo?

Se implementaron rutas RESTful para operaciones CRUD completas: GET para mostrar productos, POST para crear, PUT para actualizar y DELETE para eliminar.

¿Por qué?

Las rutas RESTful siguen convenciones estándar de la industria, haciendo la API predecible y fácil de mantener. Cada método HTTP tiene un propósito específico.

¿Para qué sirve?

Permite que el frontend se comunique con el backend de manera estructurada, facilitando operaciones de productos y proporcionando una API clara y consistente.

Manejo de Errores

Manejo de Errores
¿Qué se hizo?

Se implementó middleware para capturar errores 404 (página no encontrada) y errores generales del servidor (500), mostrando páginas de error personalizadas.

¿Por qué?

El manejo de errores es fundamental para proporcionar una experiencia de usuario profesional y ayudar en el debugging durante el desarrollo.

¿Para qué sirve?

Evita que la aplicación se rompa completamente cuando ocurren errores, proporcionando mensajes informativos y manteniendo la estabilidad del servidor.

Sistema de Modales Dinámicos

Sistema de Modales JavaScript
¿Qué se hizo?

Se implementó un sistema completo de modales usando JavaScript vanilla, con creación dinámica de elementos DOM para mostrar feedback al usuario.

¿Por qué?

Los modales proporcionan feedback inmediato y consistente sin recargar la página, mejorando significativamente la experiencia del usuario.

¿Para qué sirve?

Informa al usuario sobre el resultado de sus acciones (éxito, error, confirmación) y previene acciones accidentales como eliminar productos.

Validación de Formularios

Validación de Formularios
¿Qué se hizo?

Se implementó validación en tiempo real usando event listeners en el evento submit, con preventDefault() para detener envíos inválidos.

¿Por qué?

La validación del lado del cliente mejora la UX al proporcionar feedback inmediato y reduce la carga en el servidor al evitar envíos de datos inválidos.

¿Para qué sirve?

Garantiza que solo se envíen datos válidos al servidor, previene errores y mejora la experiencia del usuario con mensajes claros.

Gestión de Imágenes

Gestión de Imágenes
¿Qué se hizo?

Se implementó vista previa de imágenes usando FileReader API, con validación de tipo de archivo y tamaño máximo (5MB).

¿Por qué?

FileReader permite mostrar vistas previas instantáneas sin subir el archivo al servidor, mejorando la experiencia del usuario y optimizando el rendimiento.

¿Para qué sirve?

Permite al usuario ver la imagen antes de guardar, valida que sea un archivo de imagen válido y controla el tamaño para optimizar el almacenamiento.

Operaciones CRUD con Fetch API

Operaciones CRUD con Fetch API
¿Qué se hizo?

Se implementaron operaciones asíncronas usando Fetch API con async/await para eliminar productos, incluyendo manejo completo de errores.

¿Por qué?

Fetch API es la forma moderna de hacer peticiones HTTP en JavaScript, y async/await hace el código más legible que las promesas tradicionales.

¿Para qué sirve?

Permite operaciones del lado del cliente sin recargar la página, proporcionando una experiencia fluida y moderna al usuario.

Formateo de Datos y Localización

Formateo de Datos
¿Qué se hizo?

Se implementó formateo automático de precios usando Intl.NumberFormat para pesos chilenos y toLocaleDateString para fechas.

¿Por qué?

Intl API proporciona formateo estándar y localizado, asegurando consistencia y legibilidad para usuarios chilenos.

¿Para qué sirve?

Mejora la legibilidad de precios y fechas, proporciona formato consistente en toda la aplicación y respeta las convenciones locales.

Animaciones y Mejoras de UX

Animaciones y UX
¿Qué se hizo?

Se implementaron microinteracciones con event listeners para hover effects en botones y transiciones suaves en modales.

¿Por qué?

Las animaciones proporcionan feedback visual inmediato, haciendo que la interfaz se sienta más responsiva y profesional.

¿Para qué sirve?

Mejora la percepción de calidad de la aplicación, proporciona feedback visual claro y hace la experiencia más atractiva e interactiva.

Resumen Técnico del Código JavaScript

Tecnologías Utilizadas
  • Vanilla JavaScript: Sin frameworks, máximo rendimiento
  • Fetch API: Comunicación asíncrona moderna
  • FileReader API: Manejo de archivos en el cliente
  • Intl API: Localización y formateo
  • DOM Manipulation: Creación dinámica de elementos
Patrones Implementados
  • Event Delegation: Manejo eficiente de eventos
  • Async/Await: Manejo moderno de promesas
  • Error Handling: Try/catch comprehensivo
  • Modular Functions: Código reutilizable
  • Progressive Enhancement: Funcionalidad sin JavaScript
Características Destacadas
  • Responsive Design: Funciona en todos los dispositivos
  • Accessibility: Navegación por teclado y screen readers
  • Performance: Optimizado para carga rápida
  • User Experience: Feedback inmediato y consistente
  • Error Recovery: Manejo graceful de errores

Funcionalidades Detalladas

Servidor y Rutas

  • Servidor Express: Configurado en puerto 3000
  • Ruta Principal: Mensaje de bienvenida
  • Ruta Productos: Lista dinámica con EJS
  • Ruta POST: Agregar productos via formulario

Persistencia y Archivos

  • Archivo JSON: Almacenamiento de productos
  • Operaciones fs: Lectura/escritura asíncrona
  • Multer: Manejo de archivos de imagen
  • Validación: Tipos de archivo permitidos

Aprendizajes y Desafíos

Lo que Aprendí

  • Configuración de servidores Express.js
  • Persistencia de datos con módulo fs
  • Implementación de rutas dinámicas y estáticas
  • Gestión de dependencias con npm
  • Manejo de archivos con Multer
  • Implementación de middleware para errores

Desafíos Superados

  • Configuración correcta del servidor Express
  • Implementación de persistencia con archivos JSON
  • Manejo asíncrono de operaciones de archivos
  • Configuración de Multer para subida de imágenes
  • Implementación de manejo de errores 404 y 500
  • Documentación completa del proceso de desarrollo

Enlaces y Recursos