Servidor Express

Descripción

  • Montar un servidor web mediante paquetes propios de node

Objetivos

  • Entender la arquitectura de Express

    • Middleware

    • Uso de paquetes para extender la funcionalidad de Express

  • Creación de un servidor web que sirva:

    • Contenido estático

    • Contenido dinámico en base a templates

    • Content-type en JSON (para API posterior)

Empezamos proyecto

Documentación

express

  • Instalar express mediante uno de los comandos siguientes:

  • Creamos el fichero server.js con el siguiente código:

Ejecución

  • Debería ejecutarse de cualquiera de las siguientes maneras:

  • Utiliza nodemon para evitar reinicios al cambiar código

Prueba funcionamiento

  • Se echa de menos algún tipo de mensaje de arranque

  • Mira en la documentación como añadir esa opción

    • Cuando el método listen haya terminado...

Método listen

  • Permite añadir más parámetros

  • Un parámetro de tipo función (función de callback)

    • Es el único parámetro de este tipo, así los diferencia

Añadir otra ruta

  • Utiliza el plugin ExpressSnippet de Visual Code para completado

    • Comprueba su funcionamiento con el app.listen

  • Datos nueva ruta:

    • URL: /contactar

    • Muestre el mensaje Página para contactar

Código ruta contactar

Uso de JSON

  • Vamos a devolver un JSON en vez de un string:

Comprobar JSON

  • Utiliza algún plugin de formateo de JSON dentro del navegador

    • El JSON puede ser más complejo que el anterior, por ej:

  • Comprueba como cambia el content type

    • Utiliza las herramientas de desarrollo

    • El cambio lo hace directamente Express

  • Los datos en JSON podrían estar:

    • En una variable

    • Incluso en otro fichero

    • Recibirse vía API

    • ....

Middleware

  • Son funciones que:

    • Se registran por express mediante app.use y se ejecutan en orden

    • Tienen acceso al objeto de solicitud (req), al objeto de respuesta (res) y a la siguiente función de middleware (next)

Ejemplo de middleware

  • Podemos crear un middleware que guarde traza de las fechas de accesos

  • Para ver las propiedades que nos hacen falta podemos usar la API de Express

  • Es importante el orden

    • Entre los middlewares

    • Antes que las peticiones get, post....

Logs a fichero

  • Completa el middleware anterior para que guarde los cambios en el fichero server.log

  • Piensa donde se debe poner el next() y si debes utilizar un método síncrono o asíncrono

Solución logs a fichero

Más sobre logs

  • Podemos querer utilizar distintos transports o medios para logs

    • Ficheros

    • Consola

  • Distintos niveles (debug, err, warning...)

  • Distintos formatos de visualización (colores, negrita...)

  • Con posibilidad de ejecución de queries

  • ....

Uso de contenido estático

  • Crea un fichero .html en la carpeta public

    • Ayúdate de emmet: ! + tab

  • Express ya tiene un middleware integrado para contenido estático

    • No deja de ser una función como las vistas anteriormente

    • No necesitamos importarla mediante un require

    • Una vez importado, hace un send() si existe el fichero, si no, un next()

Configuración express para contenido estático

  • __dirname es la raíz del proyecto

  • path.join para que sea multiplataforma

  • Podríamos configurar un directorio virtual (static para public)

Template engine

  • Mostrar un index.html está bien pero puede que necesitemos:

    • Inyectar valores en el html

    • "includes" para footer, header... (patrón diseño DRY)

  • Tenemos que elegir un motor de plantillas

Configuración de hbs

  • Instalación

  • Configuración

    • No hacemos un require porque no usamos ninguna función

    • express lo llama internamente

  • Indicamos a nodemon los tipos de ficheros a monitorizar (por defecto solo js):

Uso de hbs

  • Definimos una carpeta views donde irán las templates

  • Fichero views/contactar.hbs:

  • Ejecutamos el método res.render() en vez de res.send()

    • Admite un objeto como segundo parámetro para pasar variables

Partials mediante handlebars

  • Registramos el directorio donde se van a guardar:

  • Creamos fichero views/partials/footer.hbs:

  • Lo incluimos dentro de nuestro fichero views/contactar.hbs:

Ejercicio templates

  • Añade una página de inicio además de contactar

  • Ambas deben cargar su correspondiente template que además cargará un partial para el header y otro para el footer

Uso de helpers

  • Se registran funciones que devuelven un código dinámico

  • Se pueden inyectar en cualquier template o partial.

  • Podríamos eliminar el paso de currentYear a las vistas y utilizar el helper:

¿Continuamos?

Last updated

Was this helpful?