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-adminnpm installnpm run devstartPara 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 axiosroutes/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.jsonEn 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>
...