Para ahorrar líneas de código y reutilizar componentes, Express ofrece el uso de partials como porciones reutilizables de etiquetas de HTML.
Crea un nuevo proyecto, según Express - Bases y Express - Bootstrap.
hito2-admin
npm install
npm run devstart
Para el sitio de ejemplo será necesario separar las secciones que pueden reutilizarse otras vistas (layout) y las secciones que son únicas por vista.
<main>
junto con todo su contenido.partials
.views/partials/main.ejs
.views/partials/main.ejs
.<%- include("partials/main") -%>
, en el lugar donde se encontraba la etiqueta <main>
.
http://localhost:3000/
Del views/index.ejs
, repite el proceso anterior para las etiquetas <header>
y <nav>
.
<header>
en el partial views/partials/header.ejs
<nav>
en el partial views/partials/nav.ejs
Para crear la página de fotos, utilizaremos los archivos del recurso fotos.zip. La plantilla del fotos es Bootstrap User Management Data Table.
fotos.ejs
dentro de la carpeta views
.fotos_tabla.ejs
dentro de la carpeta views/partials
.
fotos_tabla.ejs
table.css
dentro de la carpeta public/stylesheets
.routes/index.js
"/photos"
con la vista fotos.ejs
.
...
router.get('/photos', function(req, res, next) {
res.render('fotos', { title: 'Fotos' });
})
...
http://localhost:3000/photos
views/partials/nav.ejs
...
<a class="nav-link" href="#">
...
Products
</a>
...
por
...
<a class="nav-link" href="/photos">
...
Photos
</a>
...
...
<a class="nav-link active" aria-current="page" href="#">
...
Dashboard
</a>
...
por
...
<a class="nav-link active" aria-current="page" href="/">
...
Dashboard
</a>
...
http://localhost:3000/
axios
, con: npm i axios
routes/index.js
axios
...
var express = require('express');
const axios = require('axios')
...
/photos
...
router.get('/photos', async function(req, res, next) {
const URL = 'https://dawm-fiec-espol-default-rtdb.firebaseio.com/photos.json'
const config = {
proxy: {
host: 'localhost',
port: 4444
}
}
const response = await axios.get(URL, config) #de ser necesario, incluya la constante config como segundo parámetro del método get
res.render('fotos', { title: 'Fotos', fotos: response.data });
})
...
routes/index.js
, en el controlador para la ruta /photos
http://localhost:8080/photos.json
En la vista de fotos, del archivo views/fotos.ejs, envíe como parámetro el arreglo de fotos.
...
<div class="container-fluid">
<div class="row">
<%- include("partials/nav") -%>
<!-- Foto tabla -->
<%- include("partials/fotos_tabla", {arrFotos:fotos} ) -%>
</div>
</div>
...
En la vista, en el partial views/partials/fotos_tabla.ejs, reemplace el contenido de la etiqueta <table>
:
...
<table class="table table-striped table-hover">
<thead>
<tr>
<th>#</th>
<th>Description</th>
<th>URL</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<% arrFotos.forEach((foto, idx) => { %>
<tr>
<td><%= idx %></td>
<td><%= foto.descripcion %></td>
<td><%= foto.url %></td>
<td>
<a href="#" class="settings" title="Settings" data-toggle="tooltip"><i class="material-icons"></i></a>
<a href="#" class="delete" title="Delete" data-toggle="tooltip"><i class="material-icons"></i></a>
</td>
</tr>
<% }); %>
</tbody>
</table>
...