Web de Lista de Libros
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
Métodos para Iniciar el Proyecto
a) npm run dev (Recomendado para desarrollo)
bash
npm run dev
Cómo funciona: Ejecuta el script "dev" definido en tu package.json
Requisito: Debes tener Nodemon instalado y configurado en package.json:
json
"scripts": {
"dev": "nodemon app.js"
}
c) npm start (Para producción)
bash
npm start
Configuración típica:
json
"scripts": {
"start": "node app.js"
}
Aplicación Web de Lista de Libros con Node.js, Express, EJS y MySQL
Voy a corregir y complementar tu proyecto para crear una aplicación web básica de lista de libros. Te explicaré cada parte del proceso.
Estructura del Proyecto Corregida
booklist-app/
├── public/ # Archivos estáticos (CSS, JS, imágenes)
├── routes/ # Archivos de rutas
│ ├── index.js # Rutas principales
│ ├── users.js # Rutas de usuarios
│ └── libros.js # Rutas de libros (antes productos.js)
├── views/ # Plantillas EJS
│ ├── layouts/ # Plantillas parciales
│ │ ├── header.ejs # Cabecera común
│ │ └── footer.ejs # Pie de página común
│ ├── error.ejs # Página de error
│ ├── index.ejs # Página principal
│ ├── nosotros.ejs # Página "Nosotros"
│ └── libros.ejs # Página de libros (antes productos.ejs)
├── conexion/ # Configuración de base de datos
│ └── conexion.js # Conexión a MySQL
└── app.js # Aplicación principalCorrecciones y Explicaciones
1. app.js (Aplicación principal)
const express = require('express');
const path = require('path');
const logger = require('morgan');
const cookieParser = require('cookie-parser');
// Importar rutas
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const librosRouter = require('./routes/libros'); // Cambiado de productos a libros
const app = express();
// Configuración del motor de vistas
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs'); // Corregido "app.ser" por "app.set"
// Middlewares
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false })); // Corregido "uslencoded" por "urlencoded"
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); // Archivos estáticos
// Rutas
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/libros', librosRouter); // Cambiado de productos a libros
// Manejador de errores 404
app.use(function(req, res, next) {
res.status(404).render('error', { title: 'Página no encontrada' });
});
// Manejador de errores generales
app.use(function(err, req, res, next) {
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
res.status(err.status || 500);
res.render('error');
});
module.exports = app;2. conexion/conexion.js (Conexión a MySQL)
const mysql = require('mysql'); // Corregido "MySQL" por "mysql"
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'biblioteca' // Cambiado de 'ventas' a 'biblioteca' para el ejemplo de libros
});
connection.connect((err) => {
if (!err) {
console.log("Conexión establecida con la base de datos");
} else {
console.log("Conexión fallida: " + err.message); // Corregido "cosole" por "console"
}
});
module.exports = connection;3. routes/libros.js (antes productos.js)
const express = require('express');
const router = express.Router();
const db = require("../conexion/conexion");
// GET lista de libros
router.get('/', function(req, res, next) {
db.query("SELECT * FROM libros", function(err, resultados) { // Cambiado de tblproductos a libros
if (err) {
console.error("Error al obtener libros:", err);
return next(err); // Pasar el error al manejador de errores
}
console.log(resultados);
res.render('libros', {
title: 'Nuestra colección de libros',
libros: resultados // Cambiado de Libros a libros (convención)
});
});
});
module.exports = router;4. routes/index.js
const express = require('express');
const router = express.Router();
/* GET home page (index.ejs) */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Biblioteca Digital' }); // Corregido 'index0' por 'index'
});
/* GET Sección nosotros */
router.get('/nosotros', function(req, res, next) {
res.render('nosotros', { title: 'Sobre nosotros' }); // Corregido comillas incorrectas
});
module.exports = router;5. views/layouts/header.ejs
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= title %></title>
<link rel="stylesheet" href="/stylesheets/style.css">
</head>
<body>
<nav>
<a href="/">Inicio</a>
<a href="/nosotros">Nosotros</a>
<a href="/libros">Libros</a> <!-- Cambiado de productos a libros -->
</nav>
<div class="container">6. views/layouts/footer.ejs
</div> <!-- Cierre del container -->
<footer>
<p>© <%= new Date().getFullYear() %> Biblioteca Digital</p>
</footer>
</body>
</html>7. views/libros.ejs (antes productos.ejs)
<%- include('layouts/header') %>
<h1><%= title %></h1>
<% if (libros.length > 0) { %>
<ul class="list-group">
<% libros.forEach(function(libro) { %>
<li class="list-group-item">
<h3><%= libro.titulo %></h3>
<p><strong>Autor:</strong> <%= libro.autor %></p>
<p><strong>Año:</strong> <%= libro.anio_publicacion %></p>
</li>
<% }); %>
</ul>
<% } else { %>
<p>No hay libros disponibles en este momento.</p>
<% } %>
<%- include('layouts/footer') %>8. views/index.ejs
<%- include('layouts/header') %>
<h1><%= title %></h1>
<p>Bienvenido a nuestra biblioteca digital</p>
<p>Explora nuestra colección de libros.</p>
<%- include('layouts/footer') %>9. views/nosotros.ejs
<%- include('layouts/header') %>
<h1><%= title %></h1>
<p>Somos una biblioteca digital comprometida con la difusión del conocimiento.</p>
<%- include('layouts/footer') %>Configuración de la Base de Datos
Antes de ejecutar la aplicación, necesitas crear la base de datos y la tabla de libros:
CREATE DATABASE biblioteca;
USE biblioteca;
CREATE TABLE libros (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(255) NOT NULL,
autor VARCHAR(255) NOT NULL,
anio_publicacion INT,
genero VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Insertar algunos datos de ejemplo
INSERT INTO libros (titulo, autor, anio_publicacion, genero) VALUES
('Cien años de soledad', 'Gabriel García Márquez', 1967, 'Realismo mágico'),
('1984', 'George Orwell', 1949, 'Ciencia ficción'),
('El principito', 'Antoine de Saint-Exupéry', 1943, 'Literatura infantil');Pasos para Ejecutar la Aplicación
Instalar dependencias:
npm install express ejs mysql morgan cookie-parserIniciar la aplicación:
node app.jsAbrir en el navegador:
http://localhost:3000Explicación de los Componentes
Express: Framework web para Node.js que simplifica la creación de aplicaciones web.
EJS (Embedded JavaScript): Motor de plantillas que permite generar HTML dinámico.
Middleware:
express.json(): Para parsear cuerpos de solicitud en formato JSON.express.urlencoded(): Para parsear datos de formularios.express.static(): Para servir archivos estáticos (CSS, JS, imágenes).
Rutas:
Modularizadas en archivos separados para mejor organización.
Cada archivo de rutas define endpoints específicos.
MySQL:
Conexión a base de datos relacional para almacenar y recuperar información de libros.
Las consultas se realizan con el método
query().
Estructura MVC (Modelo-Vista-Controlador):
Modelo: La conexión a la base de datos (
conexion.js).Vista: Las plantillas EJS en la carpeta
views.Controlador: Las rutas que manejan la lógica de la aplicación.
Esta aplicación básica puede extenderse con funcionalidades como:
Formularios para agregar nuevos libros
Búsqueda y filtrado de libros
Autenticación de usuarios
Sistema de préstamos
¿Te gustaría que profundicemos en alguna parte específica de la aplicación?
Comentarios
Publicar un comentario