Web de Lista de Tareas
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
3. HTTP y Express
Qué es un servidor web.
Rutas (app.get
, app.post
).
Middleware básico (express.urlencoded
para formularios).
Uso de express.static
para archivos CSS/JS.
Qué es un servidor web.
Rutas (app.get
, app.post
).
Middleware básico (express.urlencoded
para formularios).
Uso de express.static
para archivos CSS/JS.
1. Fundamentos Obligatorios (1-2 días)
Tema Qué Aprender Recursos Node.js Básico Módulos, require
, exports
, NPM Node.js Docs HTTP y Express Crear servidor, rutas básicas, middleware Express Hello World API REST Verbos HTTP (GET, POST, PUT, DELETE) REST API Concepts
Tema | Qué Aprender | Recursos |
---|---|---|
Node.js Básico | Módulos, require , exports , NPM | Node.js Docs |
HTTP y Express | Crear servidor, rutas básicas, middleware | Express Hello World |
API REST | Verbos HTTP (GET, POST, PUT, DELETE) | REST API Concepts |
Aplicación Web de Lista de Tareas con Node.js y Express (No API)
¡Perfecto! Vamos a crear una aplicación web completa con interfaz visual. Usaremos Express + EJS para renderizar HTML en el servidor (Server-Side Rendering).
📌 Estructura del Proyecto
todo-app/
├── app.js
├── package.json
├── views/
│ ├── index.ejs
│ └── partials/
│ ├── header.ejs
│ └── footer.ejs
└── public/
├── css/
│ └── style.css
└── js/
└── script.js
🛠️ Paso 1: Configuración Inicial
npm init -y
npm install express ejs
💻 Código Base (app.js
)
const express = require('express');
const app = express();
const PORT = 3000;
// Configuración de EJS y archivos estáticos
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.use(express.urlencoded({ extended: true })); // Para procesar formularios
// "Base de datos" temporal
let tasks = [
{ id: 1, title: 'Aprender Node.js', completed: false },
{ id: 2, title: 'Crear una app To-Do', completed: true }
];
// Rutas
app.get('/', (req, res) => {
res.render('index', { tasks });
});
app.post('/add', (req, res) => {
const newTask = {
id: Date.now(),
title: req.body.task,
completed: false
};
tasks.push(newTask);
res.redirect('/');
});
app.get('/complete/:id', (req, res) => {
const task = tasks.find(t => t.id === parseInt(req.params.id));
if (task) task.completed = !task.completed;
res.redirect('/');
});
app.get('/delete/:id', (req, res) => {
tasks = tasks.filter(task => task.id !== parseInt(req.params.id));
res.redirect('/');
});
app.listen(PORT, () => {
console.log(`App running on http://localhost:${PORT}`);
});
🎨 Vista Principal (views/index.ejs
)
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Lista de Tareas</title>
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<%- include('partials/header') %>
<main class="container">
<h1>Mis Tareas</h1>
<form action="/add" method="POST">
<input type="text" name="task" placeholder="Nueva tarea..." required>
<button type="submit">➕ Añadir</button>
</form>
<ul class="task-list">
<% tasks.forEach(task => { %>
<li class="<%= task.completed ? 'completed' : '' %>">
<%= task.title %>
<div>
<a href="/complete/<%= task.id %>">
<%= task.completed ? '❌ Desmarcar' : '✅ Completar' %>
</a>
<a href="/delete/<%= task.id %>" class="delete">🗑️ Eliminar</a>
</div>
</li>
<% }); %>
</ul>
</main>
<%- include('partials/footer') %>
</body>
</html>
✂️ Partial Views
views/partials/header.ejs
<header>
<h1>To-Do App</h1>
</header>
views/partials/footer.ejs
<footer>
<p>© <%= new Date().getFullYear() %> Lista de Tareas</p>
</footer>
🎨 CSS Básico (public/css/style.css
)
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 0;
padding: 0;
background: #f4f4f4;
}
.container {
width: 80%;
margin: 20px auto;
background: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.task-list {
list-style: none;
padding: 0;
}
.task-list li {
padding: 10px;
margin: 5px 0;
background: #eee;
display: flex;
justify-content: space-between;
align-items: center;
}
.task-list li.completed {
text-decoration: line-through;
opacity: 0.7;
}
.delete {
color: red;
margin-left: 10px;
}
🔍 ¿Cómo Funciona?
Añadir tareas: Formulario POST a
/add
Completar tareas: GET a
/complete/:id
(alterna estado)Eliminar tareas: GET a
/delete/:id
🚀 Mejoras Posibles
Base de datos: Usar SQLite o MongoDB
Validaciones: Verificar datos antes de procesar
Sesiones: Usar
express-session
para múltiples usuariosJavaScript en cliente: Mejorar interacción sin recargar
📚 Recursos Adicionales
¡Ahora tienes una aplicación web funcional con Node.js y Express! 🌟
Comentarios
Publicar un comentario