const express =require('express');const bodyParser =require('body-parser');const path =require('path');const app =express();constPORT= process.env.PORT||3000;// Configurar EJS como motor de plantillas
app.set('view engine','ejs');
app.set('views', path.join(__dirname,'views'));// Middleware para archivos estáticos
app.use(express.static(path.join(__dirname,'public')));// Middleware para parsear datos de formularios
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());// Rutas
app.get('/',(req, res)=>{
res.render('index',{titulo:'Página Principal'});});// Ruta para mostrar formulario
app.get('/formulario',(req, res)=>{
res.render('formulario',{titulo:'Formulario de Registro',error:null});});// Ruta para procesar formulario
app.post('/enviar-formulario',(req, res)=>{const{ nombre, email, mensaje }= req.body;// Validación básicaconst errores =[];if(!nombre) errores.push('El nombre es requerido');if(!email) errores.push('El email es requerido');if(errores.length >0){return res.render('formulario',{titulo:'Error en el Formulario',error: errores,datosAnteriores: req.body
});}// Procesar datos
res.render('resultado',{titulo:'Resultado del Formulario',
nombre,
email,
mensaje
});});// Iniciar servidor
app.listen(PORT,()=>{
console.log(`Servidor corriendo en http://localhost:${PORT}`);});
Plantillas EJS
views/index.ejs
ejs
<!DOCTYPEhtml><htmllang="es"><head><metacharset="UTF-8"><title><%= titulo %></title><linkrel="stylesheet"href="/css/styles.css"></head><body><divclass="container"><h1>Bienvenido</h1><nav><ahref="/formulario"class="btn">Ir al Formulario</a></nav></div></body></html>
<!DOCTYPEhtml><htmllang="es"><head><metacharset="UTF-8"><title><%= titulo %></title><linkrel="stylesheet"href="/css/styles.css"></head><body><divclass="container"><h1>Resultado del Formulario</h1><divclass="resultado"><p><strong>Nombre:</strong><%= nombre %></p><p><strong>Email:</strong><%= email %></p><%if(mensaje){%><p><strong>Mensaje:</strong><%= mensaje %></p><%}%></div><ahref="/formulario"class="btn">Volver al Formulario</a></div></body></html>