Express
El microframework popular de NodeJS
Express es una librería basada en Javascript y es la librería más popular para trabajar con NodeJS. Permite crear proyectos para aplicaciones web trabajando con otras librerías y frameworks. Cuenta con un sistema de rutas que maneja los métodos HTTP de forma muy eficiente y además permite trabajar con una amplia variedad de sistemas de plantillas. Express es considerado un microframework debido al tamaño de su núcleo, que a diferencia de otros frameworks, es muy reducido y destaca por disponer de una estructura flexible y sencilla. Este denominado microframework no ofrece todas las ventajas o recursos que si ofrecen otros frameworks, funcionalidades como pueden ser la autenticación de usuarios, métodos para el manejo de bases de datos, pruebas de testing, etc..., pero si ofrece gran cantidad de paquetes de middleware compatibles, rápidos y fáciles de instalar que permiten conectarse con Express y que permiten realizar cualquier funcionalidad como cualquier otro framework.
INSTALAR EXPRESS
npm install express
MANEJO DE PETICIONES
ENRUTADO BÁSICO
Para la implementación de Express es necesario llamar a la librería e instanciarla como un objeto. Este objeto es el que va a permitir trabajar con los distintos métodos de Express. A continuación un ejemplo de un proyecto Express muy básico.
const express = require("express"),
app=express();
app.all("/",(req,res) => {
res.send("Respuesta con Express.js");
})
app.listen(3000, () => {"Iniciando Express.js en el puerto 3000 });
Analizando el ejemplo anterior se observa como se crea la instancia en la constante app y esa constante realiza una llamada al método all() de Express. A este método all (que engloba todos los verbos o métodos de HTTP) se le pasa como primer parámetro la ruta de la petición y como segundo parámetro un callback que envía los parámetros de petición y respuesta (muy presentes en los métodos de Express). Por último se llama al método listen indicando el número de puerto a escuchar y un callback que permite mostrar algún tipo de información en la terminal.
ENRUTADO BÁSICO CON MÉTODOS
Express permite manejar las rutas con los distintos métodos o verbos de http. El código siguiente muestra como se crean las rutas con algunos de los métodos más utilizados. El código refleja la posibilidad de compartir la misma ruta, siempre y cuando, los métodos sean distintos.
const express = require("express"),
app=express();
app
.get("/user",(req,res) => res.end("Hola Mundo desde Express.js vía get"))
.post("/user",(req,res) => res.send("Hola desde Express vía post"))
.delete("/user",(req,res) => res.send("Hola desde Express vía delete"))
.listen(3000,() => console.log("Iniciando Express.js en el puerto 3000"))
ENRUTAR ARCHIVO ESTÁTICO
Es posible mostrar el contenido de un archivo en el navegador mediante el método sendFile y enviando la ruta de un archivo estático.
const express = require("express"),
app=express();
app.get("/",(req,res) => {
res.sendFile(`${__dirname}/index.html`);
})
app.listen(3000, () => {"Iniciando Express.js en el puerto 3000 });
RUTAS CON PARÁMETROS
Express permite manejar los parámetros pasados por la url mediante el signo de dos puntos y concatenarlos de forma indefinida. A continuación un ejemplo de rutas con parámetros mediante el uso de los dos puntos y separando los parámetros por guiones. Para evitar errores con tildes, eñes y otros caracteres es recomendable añadir el tipo de contenido y el tipo de codificación de caracteres con el método set.
const express = require("express"),
app=express();
app.get("/user/:id-:name-:age",(req,res) => {
res
.set({"Content-Type":"text/html,charset=UTF-8"})
.end(`
El usuario ${req.params.name} tiene ${req.params.age} años
`);
})
app.listen(3000, () => {"Iniciando Express.js en el puerto 3000 });
RUTAS CON PARÁMETROS DE TIPO BÚSQUEDA
Express permite obtener información de las variables incluidas en la url, muy útil para los mecanismos de búsqueda. Para ello en lugar de params visto en el apartado anterior, dispone del método query que permite indicar el nombre de la variable y manejar el valor pasado por dicha variable.
const express=require("express"),
app=express();
app
.get("/search",(req,res) => {
res
.set({"content-type":"text/html;charset=utf-8"})
.end(`
<p>El usuario ${req.params.name} tiene ${req.params.age} años</p>
<p>Los datos de s: ${req.query.w}</p>
`)
})
app.listen(3000, () => {"Iniciando Express.js en el puerto 3000 });
En el código de arriba se observa como la variable asignada al método query es una w (aunque podría tener cualquier otro nombre), por tanto, a diferencia de las rutas anteriores que se puede indicar el tipo de separador como diagonal o guión (/ , -) que son los más comunes. Para este tipo de parámetros es necesario utilizar el interrogante seguido de la variable y su valor, comparable al manejo de parámetros de forma nativa en PHP. Para dejar clara la diferencia, la ruta necesaria para una petición con parámetros con guiones, tal como se describe en la sección anterior, debería ser de esta forma:
http://localhost:3000/users/12-Albert-58
Mientras que para realizar una petición, tal como se describe en esta sección, debería ser de esta otra:
http://localhost:3000/search?w=dato
RUTAS DINÁMICAS
Las rutas dinámicas posibilitan la modificación o cambio del contenido basándose en la información pasada por la url. Express permite trabajar mediante el objeto Router con rutas dinámicas, por lo general se crea un directorio routes donde se almacenan los archivos manteniendo una estructura más ordenada. Para trabajar con estas rutas es necesario indicar los datos requeridos de la url y la ubicación del archivo de ruta en cuestión.
let dinamicRoute = require("./routes/dinamic")
app.use("/", dinamicRoute)
El archivo de rutas puede interferir en la ruta o complementarla permitiendo trabajar las distintas rutas de forma independiente con los parámetros de la url.
var express = require("express")
var router = express.Router();
router.get("/", (req,res) => {
res.send("respuesta");
})
router.get("/:id", (req,res) => {
res.send("Parámetro pasado por url: "+ req.params.id);
})
module.exports = router;
MANEJO DE RESPUESTAS
REDIRECCIONES
Express dispone de métodos de respuesta que permiten redireccionar a una ruta externa. Para ello es necesario indicar el tipo de redirección y la ruta a la que se va a enviar.
const express = require("express"),
app=express();
app
.get("/",(req,res) => {
res.send("Hola Mundo desde Express")
})
.get("/1",(req,res) => {
res.redirect(301,"//www.google.es")
})
MANEJO DE DATOS JSON
Para el manejo de datos json existe el método json() que permite transformar datos a un objeto de tipo json.
const express = require("express"),
app=express();
app
.get("/",(req,res) => {
res.send("Hola Mundo desde Express")
})
.get("/2",(req,res) => {
res.json({
name: "Joan",
age: "57",
email: "joan@gmail.com"
})
})
RENDERIZADO
El método render permite manejar las distintas vistas en sistemas de plantillas. Existen muchos motores de plantillas handlebars, pug, hogan, etc... Para integrar un motor a Express es necesario instalarlo y registrarlo en con el método set.
.set("views", "./views")
.set("view engine", "hbs")
Express-generator dispone de opciones para instalar y registrar algunos motores de plantillas al crear el proyecto.
express --view=pug miproyecto
Las distintas opciones se pueden revisar mediante la opción de ayuda antes de crear el proyecto.
express --help
MOTORES DE PLANTILLAS
A continuación la implementación de algunos de estos sistemas de plantillas en Express.
HANDLEBARS
Handlebars es un motor de plantillas Javascript que permite generar html con objetos json, dispone de helpers, es sencillo y uno de los más utilizados.
INSTALAR HANDLEBARS
npm i hbs
HANDLEBARS EN NODEJS
Para trabajar con Handlebars es necesario importar la librería, indicar el directorio de las vistas y establecer el motor de plantillas.
const express=require("express"),
fs = require("fs"),
app= express(),
routes = require("./routes/index"),
hbs = require("hbs")
app
.set("port",(process.env.port||3000))
.set("views",`${__dirname}/views`)
.set("view engine","hbs")
.get("/",(req,res)=> {
res.render("index",{title: "Index"})
})
app.listen(3000, () => {"Iniciando Express.js en el puerto 3000 });
module.exports = app
El contenido html se almacena en archivos con extensión hbs en el directorio registrado. La plantilla se asigna automáticamente al detectar un archivo layout.hbs aunque es posible modificarlo añadiendo la propiedad layout en el método render.
.get("/",(req,res)=> {
res.render("index",{title: "Index", layout: "plantilla"})
})
El layout o plantilla permite, mediante llaves, añadir cadenas y expresiones (con doble llave) y contenido html (con triple llave).
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ title }}</title>
</head>
<body>
<div class="main">
{{{body}}}
</div>
</body>
</html>
Include en Handlebars
Handlebars también permite añadir secciones a la vista que se encuentran en otros archivos, similar a los include mediante los denominados partials. Para poder mostrar estas partes de código es necesario establecer la ruta de dichos archivos mediante el método registerPartials() y deben mantener la extensión hbs.
const express=require("express"),
fs = require("fs"),
app= express(),
routes = require("./routes/index"),
hbs = require("hbs")
hbs.registerPartials(`${__dirname}/views/partials`)
app
.set("port",(process.env.port||3000))
.set("views",`${__dirname}/views`)
.set("view engine","hbs")
.use(routes)
app.listen(
app.get("port"),
() => console.log(`Iniciando Express en el puerto ${app.get('port')}`)
)
module.exports = app
Para incluir estos archivos se indica el archivo entre dobles llaves como si de una expresión o cadena se tratase, pero, a diferencia de los anteriores se incluye un guión (>) antes del nombre del archivo.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ title }}</title>
</head>
<body>
{{>header}}
<div>
{{{body}}}
</div>
</body>
</html>
PUG
Es un motor de plantillas de alto nivel, sencillo basado en la indentación que permite generar código html sin necesidad de escribir etiquetas html. Ha sido implementado en Javascript para NodeJS y su versión anterior (jade) viene por defecto al crear un proyecto con Express-generator (aunque se recomienda instalar pug, ya que jade es considerado una versión obsoleta) .
INSTALAR PUG
npm i pug
Con Pug es posible crear contenido html de forma normal, como también es posible crearlo sin necesidad de introducir ninguna etiqueta. Para que el sistema reconozca el contenido es indispensable que los archivos dispongan de la extensión pug y la ruta se encuentre registrada en Express.
El motor de Pug toma en cuenta la indentación para identiificar el nivel de los elementos y su sintaxis se basa en caracteres y palabras reservadas que permiten sustituir etiquetas html o añadir contenido externo. Un ejemplo de ello es la palabra reservada extends, término utilizado frecuentemente por otros frameworks, que permite incorporar una plantilla a un contenido específico,y de esa forma, una plantilla con contenido más genérico, puede ser compartido en distintas vistas .
extends layout
block content
h1 = "Google"
p
a(href="//www.google.es")
El sistema de Pug en Express permite manejar y enviar datos en formato json a la vista mediante el método render.
var express = require("express");
var router = express.Router();
router.get("/:id",(req,res) => {
res.render("index",{
data:{
title: "Datos por ID",
ID: req.params.id
}
})
})
La vista recoge los datos haciendo uso de la indentación y sintaxis anteriormente mencionada
h2 #{data.title}
if data
ul
li ID: #{data.ID}
else
<p>No existe data</p>
Para poder comentar es necesario iniciar sesión