Middlewares en nodeJS, el camino para jedis backend

nodeJS dic. 20, 2019

Bienvenid@, si estas aquí es porque te ha encantado el maravilloso mundo de nodejs y quieres expandir mucho mas tu conocimiento, no tienes que buscar más pues hoy en el dev sin site vamos a conceptualizar un poco el tema de que van los middlewares en node y porque son tan útiles y necesarios en cualquier proyecto ya sea si utilizas, express, koa, o en cualquier otro framework de javascript que estes trabajando. Vamos allá!

¿Qué es un middleware?

Básicamente un middleware es una función que se ejecuta entre la petición(request) y la respuesta (response) de tu servidor, por lo tanto, puede ejecutarse antes o después de llegar al controlador, el concepto siempre es el mismo pero asegúrate de estar dentro del ciclo de vida de la petición.

Flujo de middleware en nodejs

La razón de utilizar middlewares es por una lógica muy simple, los controladores no pueden hacer ni tener todo, con esto me refiero a que existe lógica que debe realizarse mucho antes o después para en multiples lugares, imagina que vas en contra de todo y pones un pedazo de código en cada una de las rutas de tus controladores, que pasaría si necesitas realizar un pequeño cambio, esto fácil es un cambio en todos esos lugares, por consecuencia la legibilidad de tu proyecto será severamente afectada.

Características de middlewares

Los middlewares se diferencian por una serie de características que los hacen fácilmente identificables en tu código:

  • Apilables: Puedes establecer un middleware después de otro.
  • Manejan objetos principales: Estamos hablando de la solicitud y respuesta, estos objetos siempre están disponibles dentro de la función.
  • Específicos: Tienen una tarea puntual, sin código demás.
  • "Usables": La mayoría del tiempo son pasados como argumentos a la función .use().

Tipos de middlewares

Si bien podemos identificar un middleware en base a las características anteriormente mencionadas, debes tener en cuenta que hay diferentes formas de presentación de ellos e incluso se definen por tipo, vamos a checarlo:

Nivel de aplicación

Middlewares que son usados a un nivel global del servidor, son las primeras ejecutadas antes de llegar a cualquier ruta.

/* definicion de aplicación
const app = ...
*/
app.use(miSuperMiddleware);
/* luego van las rutas y lo que quieras
app.use(routes);
app.listen();
*/
Ejemplo de middleware a nivel de aplicación

Nivel de ruta

Su propio nombre lo dice estos middlewares se ubican luego de definir un enrutador de tu proyecto y engloban una grupo de rutas, es decir primero el flujo debe pasar por el middleware antes de seguir a las rutas que están definidas debajo de él.

/* definición del enrutador
const router = ...
*/

router.use(mySuperMiddleware);
/* luego las otras rutas
router.get(...
router.post(...
*/
Ejemplo de middleware a nivel de ruta

Manejador de errores

Son middlewares que se ubican estratégicamente para atrapar errores, y lanzar mensajes personalizados sin importar la ruta o cualquier cosa que esté definida después de esta función.

/* en express */
app.use (function (err, req, res, next) {
  res.status(500).send ('¡Algo se rompió!') 
})

/* en koajs */
app.use (async (ctx, next) => { 
    ctx.status = 400 
    ctx.body = '¡Algo se rompió!
})
Ejemplo de middleware manejador de errores

De terceros

En palabras muy sencillas, son middlewares que no los creas tú sino que los usas a partir de módulos de otros desarrolladores, pero todos tienen la característica de funcionar para algo especifico.

const cors = require('cors');
/** defines tu aplicacion
const app = ...
*/
app.use(cors());
Ejemplo de middleware de terceros

Casos de uso comunes

En este punto ya vas entendiendo porque son tan necesarios los middlewares en tu aplicación, puedes utilizarlos para una infinidad de objetivos entre los cuales puedes encontrar:

  • Control de acceso: Cuando tu aplicación maneja roles definidos para determinadas rutas, es decir, los usuarios tienen una sesión y necesitas saber si es un administrador, un usuario común, o un visitante, puedes revisar tu base de datos o simplemente verificar la autenticidad y el contenido de un JWT.
  • Atrapar errores de código: Nadie en su sano juicio quiere que los errores de aplicación se muestren en internet, por ello siempre debes tener un middleware que muestre mensajes personalizados en caso de errores imprevistos.
  • Seguir peticiones: Una forma ideal de comprobar como sucedieron las cosas en tu aplicación es añadiendo un identificador único a cada petición, mas adelante facilitará las cosas cuando quieres seguir un error o una serie de eventos, este caso es primordialmente utilizado en microservicios.
  • Logs: Básico, esto va de la mano con el punto anterior, si quieres evitarte dolores de cabeza, registrar errores y advertencias es imprescindible en tu servidor.
  • Carga de archivos: En determinadas circunstancias necesitamos atrapar un archivo subido al servidor, ya sea para moverlo a una carpeta de tu instancia, o quizás subirlo a S3, o incluso sólo jugar con los streams.
  • Limitar peticiones: La seguridad en un sistema nunca esta demás, por eso tener una capa que ayude a contrarrestar un eventual ataque de denegación de servicio(DOS) puede disminuir la posibilidad de que te llamen en plena tarde o peor aún en una placentera madrugada.

Para concluir y quitarnos

Como ves, los middlewares traen grandes beneficios a tu código e incluso yo diría que son imprescindibles si quieres tener un mayor control de tu servidor, ojo, ten en cuenta que no están hechos para tareas pesadas, sin embargo rango de uso no se limita a eso.

Mas adelante veremos muchos más casos de uso prácticos utilizando express y koajs para tu backend en posts exclusivos para ese fin, por ahora me queda decirte que aprovecha su uso con buen juicio, eso te ayudará a mejorar como desarrollador, sin importar si a tu servidor lo llama una aplicación web o móvil.

By giphy

No olvides compartir este post en tus redes sociales si crees que te aportó valor, y déjanos un comentario para conocer tu opinión, nos vemos en la próxima entrega.

Fernando Palacios

¡Hoy es un gran día para hacer grandes cosas!

¡Genial! Te has suscrito con éxito.
¡Genial! Ahora, completa el checkout para tener acceso completo.
¡Bienvenido de nuevo! Has iniciado sesión con éxito.
Éxito! Su cuenta está totalmente activada, ahora tienes acceso a todo el contenido.