Lista de tareas-routing y plantillas
Inicializar el proyecto
bash
npm init --yes
Express - El framework web
bash
npm install express
Morgan - Logger para desarrollo
bash
npm install morgan
Motor de plantillas
bash
npm install ejs
npm install
npm start
Lista de Tareas en Node.js con Routing y Plantillas JS
Aquí tienes un ejemplo básico de una aplicación Node.js que gestiona una lista de tareas (solo guardando los nombres) usando routing y plantillas JavaScript (con EJS como motor de plantillas).
Estructura del proyecto
tareas-app/
├── package.json
├── app.js
├── views/
│ ├── index.ejs
│ └── tareas.ejs
└── routes/
└── tareas.js
1. Configuración inicial (package.json)
{
"name": "tareas-app",
"version": "1.0.0",
"description": "Lista de tareas simple",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.18.2",
"ejs": "^3.1.9"
}
}
2. Archivo principal (app.js)
const express = require('express');
const path = require('path');
const tareasRouter = require('./routes/tareas');
const app = express();
// Configuración de EJS como motor de plantillas
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
// Middleware
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, 'public')));
// Rutas
app.use('/tareas', tareasRouter);
app.get('/', (req, res) => {
res.render('index');
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Servidor corriendo en http://localhost:${PORT}`);
});
3. Router de tareas (routes/tareas.js)
const express = require('express');
const router = express.Router();
// Arreglo para almacenar las tareas (solo nombres)
let tareas = [];
// Mostrar todas las tareas
router.get('/', (req, res) => {
res.render('tareas', { tareas });
});
// Agregar nueva tarea
router.post('/', (req, res) => {
const { nombre } = req.body;
if (nombre && nombre.trim() !== '') {
tareas.push(nombre.trim());
}
res.redirect('/tareas');
});
// Eliminar tarea
router.post('/eliminar/:index', (req, res) => {
const index = parseInt(req.params.index);
if (index >= 0 && index < tareas.length) {
tareas.splice(index, 1);
}
res.redirect('/tareas');
});
module.exports = router;
4. Plantilla principal (views/index.ejs)
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lista de Tareas</title>
</head>
<body>
<h1>Bienvenido a la App de Tareas</h1>
<a href="/tareas">Ver lista de tareas</a>
</body>
</html>
5. Plantilla de tareas (views/tareas.ejs)
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lista de Tareas</title>
</head>
<body>
<h1>Lista de Tareas</h1>
<form action="/tareas" method="POST">
<input type="text" name="nombre" placeholder="Nueva tarea" required>
<button type="submit">Agregar</button>
</form>
<ul>
<% tareas.forEach((tarea, index) => { %>
<li>
<%= tarea %>
<form action="/tareas/eliminar/<%= index %>" method="POST" style="display: inline;">
<button type="submit">Eliminar</button>
</form>
</li>
<% }); %>
</ul>
<a href="/">Volver al inicio</a>
</body>
</html>
Instrucciones para ejecutar la aplicación
Crea la estructura de archivos y carpetas como se muestra arriba
Ejecuta
npm install
para instalar las dependenciasEjecuta
npm start
para iniciar el servidorAbre tu navegador en
http://localhost:3000
Características de la aplicación
Almacena solo los nombres de las tareas en un arreglo
Usa Express para el routing
Utiliza EJS como motor de plantillas
Permite agregar y eliminar tareas
Las rutas están organizadas en un archivo separado (tareas.js)
Puedes expandir esta aplicación agregando más funcionalidades como editar tareas, marcar como completadas, o persistir los datos en una base de datos.
Explicación Detallada del Código de la Lista de Tareas en Node.js
Voy a explicar cada parte del código para que entiendas cómo funciona todo el sistema.
1. Estructura General
La aplicación sigue una estructura MVC (Modelo-Vista-Controlador) simplificada:
Modelo: El arreglo
tareas
que almacena los datos (aunque en una app real sería una base de datos)Vista: Las plantillas EJS en la carpeta
views/
Controlador: Las rutas definidas en
routes/tareas.js
2. Archivo principal (app.js)
const express = require('express');
const path = require('path');
const tareasRouter = require('./routes/tareas');
const app = express();
Importamos Express y el módulo path para manejar rutas de archivos
Creamos la aplicación Express
Importamos el router de tareas que definiremos después
// Configuración de EJS como motor de plantillas
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
Configuramos EJS como motor de plantillas
Especificamos dónde están las vistas (carpeta
views/
)
// Middleware
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, 'public')));
express.urlencoded()
: Para procesar datos de formularios HTMLexpress.static()
: Para servir archivos estáticos (CSS, JS, imágenes)
// Rutas
app.use('/tareas', tareasRouter);
app.get('/', (req, res) => {
res.render('index');
});
Montamos el router de tareas en la ruta
/tareas
Definimos la ruta raíz (
/
) que muestra la página de inicio
3. Router de tareas (routes/tareas.js)
let tareas = [];
Aquí almacenamos las tareas (en memoria, se perderán al reiniciar el servidor)
Mostrar tareas (GET /tareas)
router.get('/', (req, res) => {
res.render('tareas', { tareas });
});
Cuando se hace GET a
/tareas
, renderiza la plantillatareas.ejs
Pasamos el arreglo
tareas
a la plantilla
Agregar tarea (POST /tareas)
router.post('/', (req, res) => {
const { nombre } = req.body;
if (nombre && nombre.trim() !== '') {
tareas.push(nombre.trim());
}
res.redirect('/tareas');
});
Recibe el nombre de la tarea desde un formulario
Verifica que no esté vacío
Agrega la tarea al arreglo
Redirige de vuelta a la lista de tareas
Eliminar tarea (POST /tareas/eliminar/:index)
router.post('/eliminar/:index', (req, res) => {
const index = parseInt(req.params.index);
if (index >= 0 && index < tareas.length) {
tareas.splice(index, 1);
}
res.redirect('/tareas');
});
Recibe el índice de la tarea a eliminar como parámetro en la URL
Verifica que el índice sea válido
Elimina la tarea del arreglo usando
splice()
Redirige de vuelta a la lista
4. Plantillas EJS
index.ejs (Página de inicio)
<a href="/tareas">Ver lista de tareas</a>
Simple enlace a la lista de tareas
tareas.ejs (Lista de tareas)
Formulario para agregar tareas:
<form action="/tareas" method="POST">
<input type="text" name="nombre" placeholder="Nueva tarea" required>
<button type="submit">Agregar</button>
</form>
Envía datos por POST a
/tareas
Campo
nombre
que coincide con lo que espera el router
Lista de tareas:
<% tareas.forEach((tarea, index) => { %>
<li>
<%= tarea %>
<form action="/tareas/eliminar/<%= index %>" method="POST" style="display: inline;">
<button type="submit">Eliminar</button>
</form>
</li>
<% }); %>
Itera sobre el arreglo
tareas
Muestra cada tarea y un botón para eliminarla
El formulario de eliminación envía POST a
/tareas/eliminar/X
donde X es el índice
Flujo de la Aplicación
El usuario visita
http://localhost:3000/
La ruta
app.get('/')
muestraindex.ejs
Al hacer clic en "Ver lista de tareas", va a
/tareas
La ruta
router.get('/')
en tareas.js muestratareas.ejs
con las tareas actualesAl agregar una tarea:
El formulario envía POST a
/tareas
El router agrega la tarea al arreglo y redirige a
/tareas
Al eliminar una tarea:
El formulario de eliminación envía POST a
/tareas/eliminar/X
El router elimina la tarea y redirige a
/tareas
¿Por qué usar POST para eliminar?
En aplicaciones web tradicionales:
GET: Para obtener recursos (no deberían modificar datos)
POST: Para crear/modificar/eliminar recursos
Por eso usamos POST para ambas operaciones que modifican datos (agregar y eliminar).
Posibles Mejoras
Usar una base de datos para persistencia
Agregar validación más robusta
Añadir estilo CSS
Implementar edición de tareas
Agregar autenticación de usuarios
Explicación de los Middlewares en Express
Estas dos líneas son middlewares esenciales en una aplicación Express. Vamos a analizar cada una:
1. app.use(express.urlencoded({ extended: true }));
¿Qué hace?
Este middleware se encarga de procesar los datos que vienen desde formularios HTML enviados con el método POST.
Detalles técnicos:
Cuando envías un formulario HTML con
method="POST"
yenctype="application/x-www-form-urlencoded"
(que es el valor por defecto)Los datos llegan al servidor en formato
nombre=valor&nombre2=valor2
Este middleware parsea (interpreta) esos datos y los convierte en un objeto JavaScript accesible en
req.body
El parámetro { extended: true }
:
extended: false
: Solo parsea datos en formato string o arrayextended: true
(recomendado): Permite parsear también objetos anidados (más flexible)
Ejemplo práctico:
Si tienes un formulario:
<form method="POST" action="/tareas">
<input type="text" name="tarea">
</form>
Al enviarlo, en tu ruta podrás acceder al valor con:
router.post('/', (req, res) => {
console.log(req.body.tarea); // Aquí está el valor del input
});
2. app.use(express.static(path.join(__dirname, 'public')));
¿Qué hace?
Este middleware sirve archivos estáticos (CSS, JavaScript, imágenes, etc.) desde un directorio específico.
Desglose:
express.static()
: Función que crea el middleware para servir archivos estáticospath.join(__dirname, 'public')
: Construye la ruta absoluta al directorio 'public'__dirname
: Variable global de Node.js que contiene la ruta del directorio actual'public'
: Nombre de la carpeta donde estarán los archivos estáticos
Cómo funciona:
Si tienes un archivo
public/css/styles.css
Podrás acceder a él en el navegador con
http://tusitio.com/css/styles.css
Express buscará automáticamente en la carpeta
public
el archivo solicitado
Ejemplo de estructura:
proyecto/
├── public/
│ ├── css/
│ │ └── styles.css
│ └── js/
│ └── script.js
├── app.js
Uso en HTML:
<link rel="stylesheet" href="/css/styles.css">
<script src="/js/script.js"></script>
¿Por qué son importantes?
express.urlencoded():
Sin él, no podrías recibir datos de formularios HTML normales
req.body
estaría vacío o undefinedEs esencial para cualquier aplicación que reciba datos de formularios
express.static():
Permite organizar y servir tus recursos frontend
Hace que Express actúe como un servidor web tradicional para archivos estáticos
Mejora el rendimiento ya que Express optimiza el servicio de estos archivos
Orden de los middlewares
El orden en que colocas estos middlewares es importante. Generalmente se colocan:
Primero los middlewares que procesan la solicitud (como urlencoded)
Luego los que sirven respuestas (como static)
¿Necesitas más detalles sobre algún aspecto específico de estos middlewares?
Comentarios
Publicar un comentario