8-convertido a EJS (Opción 1: carpeta views)
1. Nueva estructura de archivos:
mi-proyecto/
├── app.js
├── package.json
├── public/
│ └── (archivos estáticos opcionales)
└── views/ ← Carpeta creada
├── index.ejs ← Vista principal
└── productos.ejs ← Vista de productos (opcional)
mi-proyecto/
├── app.js
├── package.json
├── public/
│ └── (archivos estáticos opcionales)
└── views/ ← Carpeta creada
├── index.ejs ← Vista principal
└── productos.ejs ← Vista de productos (opcional)2. Código actualizado (app.js):
const express = require('express');
const path = require('path'); // ← Importante para path.join
const app = express();
const PORT = 3000;
// ============ CONFIGURAR EJS ============
app.set('view engine', 'ejs'); // Opción 1: carpeta 'views' por defecto
// No necesitas app.set('views') porque Express busca en 'views/'
// ============ MIDDLEWARE STATIC ============
app.use(express.static('public'));
app.use('/css', express.static('node_modules/bootstrap/dist/css'));
app.use('/js', express.static('node_modules/bootstrap/dist/js'));
// Datos de ejemplo
const productos = [
{ id: 1, nombre: 'Laptop', precio: 1000 },
{ id: 2, nombre: 'Mouse', precio: 25 },
{ id: 3, nombre: 'Teclado', precio: 50 }
];
// ============ RUTAS ============
// API REST (sigue igual)
app.get('/productos', (req, res) => {
res.json({
success: true,
cantidad: productos.length,
productos: productos
});
});
app.get('/productos/:id', (req, res) => {
const id = parseInt(req.params.id);
const producto = productos.find(p => p.id === id);
if (!producto) {
return res.status(404).json({ error: 'Producto no encontrado' });
}
res.json(producto);
});
// Ruta principal - AHORA RENDERIZA EJS
app.get('/', (req, res) => {
res.render('index', { productos }); // ← Pasa datos a la vista
});
app.listen(PORT, () => {
console.log(`🚀 Servidor corriendo en http://localhost:${PORT}`);
console.log(`📦 Ver productos: http://localhost:${PORT}/productos`);
console.log(`🎨 Ver interfaz: http://localhost:${PORT}`);
});
const express = require('express');
const path = require('path'); // ← Importante para path.join
const app = express();
const PORT = 3000;
// ============ CONFIGURAR EJS ============
app.set('view engine', 'ejs'); // Opción 1: carpeta 'views' por defecto
// No necesitas app.set('views') porque Express busca en 'views/'
// ============ MIDDLEWARE STATIC ============
app.use(express.static('public'));
app.use('/css', express.static('node_modules/bootstrap/dist/css'));
app.use('/js', express.static('node_modules/bootstrap/dist/js'));
// Datos de ejemplo
const productos = [
{ id: 1, nombre: 'Laptop', precio: 1000 },
{ id: 2, nombre: 'Mouse', precio: 25 },
{ id: 3, nombre: 'Teclado', precio: 50 }
];
// ============ RUTAS ============
// API REST (sigue igual)
app.get('/productos', (req, res) => {
res.json({
success: true,
cantidad: productos.length,
productos: productos
});
});
app.get('/productos/:id', (req, res) => {
const id = parseInt(req.params.id);
const producto = productos.find(p => p.id === id);
if (!producto) {
return res.status(404).json({ error: 'Producto no encontrado' });
}
res.json(producto);
});
// Ruta principal - AHORA RENDERIZA EJS
app.get('/', (req, res) => {
res.render('index', { productos }); // ← Pasa datos a la vista
});
app.listen(PORT, () => {
console.log(`🚀 Servidor corriendo en http://localhost:${PORT}`);
console.log(`📦 Ver productos: http://localhost:${PORT}/productos`);
console.log(`🎨 Ver interfaz: http://localhost:${PORT}`);
});3. Vista EJS (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>Mi Tienda con EJS</title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5">
<h1 class="text-center">📦 Mi Tienda de Productos</h1>
<div class="row mt-4">
<div class="col-md-6 offset-md-3">
<div class="card">
<div class="card-header">
<h3>Productos disponibles</h3>
</div>
<div class="card-body">
<!-- EJS RENDERIZA DIRECTAMENTE LOS PRODUCTOS -->
<ul class="list-group">
<% productos.forEach(producto => { %>
<li class="list-group-item">
<strong><%= producto.nombre %></strong> - $<%= producto.precio %>
<a href="/productos/<%= producto.id %>" class="btn btn-sm btn-primary float-end">Ver</a>
</li>
<% }) %>
</ul>
</div>
</div>
</div>
</div>
</div>
<script src="/js/bootstrap.min.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mi Tienda con EJS</title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5">
<h1 class="text-center">📦 Mi Tienda de Productos</h1>
<div class="row mt-4">
<div class="col-md-6 offset-md-3">
<div class="card">
<div class="card-header">
<h3>Productos disponibles</h3>
</div>
<div class="card-body">
<!-- EJS RENDERIZA DIRECTAMENTE LOS PRODUCTOS -->
<ul class="list-group">
<% productos.forEach(producto => { %>
<li class="list-group-item">
<strong><%= producto.nombre %></strong> - $<%= producto.precio %>
<a href="/productos/<%= producto.id %>" class="btn btn-sm btn-primary float-end">Ver</a>
</li>
<% }) %>
</ul>
</div>
</div>
</div>
</div>
</div>
<script src="/js/bootstrap.min.js"></script>
</body>
</html>
Comentarios
Publicar un comentario