En Express un middleware puede ser algo confuso si no estás familiarizado con las funciones callback. Hoy vamos a enseñarte como funciona un middleware, proporcionando un ejemplo de uso básico con autenticación de usuarios.

Basados en esta guia de express, los middleware son funciones que tienen acceso al objeto de solicitud (req), al objeto de respuesta (res) y a la siguiente función de middleware en el ciclo de solicitud/respuestas de la aplicación. La siguiente función de middleware se denota normalmente con una variable denominada next. Vamos a describir estos elementos a continuación:

  • El objeto “req”: Argumento de solicitud HTTP a la función de middleware, denominado “req” por convención.
  • El objeto “res”: Argumento de respuesta HTTP a la función de middleware, denominado “res” por convención.
  • La función “next”: Argumento de devolución de llamada a la función de middleware, denominado “next” por convención.

// Ejemplo de una función middleware:

function myMiddleware(req, res, next) {
  // your logic here

  next();
}

Los objetos req y res son muy simples de entender, pero la función next es un poco más complicada si eres nuevo con express, podrías hacer una aplicación completa sin usarla, lo cual es una muy mala práctica, no puedes hacer una aplicación real con express sin usar adecuadamente la función next, ya que esta es la clave para hacer una aplicación sólida y escalable con este framework. Para ayudarte a entender la función next realizaremos una app básica con autenticación de usuario.

Las aplicaciones modernas tanto web como móviles usan jwt para autenticar sus usuarios, por lo que usaremos esta librería para el siguiente ejemplo, el código a continuación es un middleware para enviar un token al usuario en el cliente, y otro para verificar el token enviado por el mismo.

// auth.middleware.js

Hay que tener en cuenta que exportamos dos funciones (module.exports), estas son las funciones middleware, la pregunta es, ­¿Como las usamos en nuestra aplicación?

Continuaremos con un ejemplo de api rest con inicio de sesión y registro para entender cómo usar estas funciones middleware, cuando un usuario inicia sesión debemos enviarle un token para manejar futuras peticiones http del mismo, además debemos verificar el token al momento de manejar estas peticiones, este será el trabajo de nuestras funciones middleware. El modelo User utilizado a continuación es solo un schema básico hecho con mongoose.

// auth.routes.js

Tenemos dos rutas aquí:

  1. ‘/login’ tiene como parámetro dos funciones, login y auth.signToken que es el middleware que definimos antes en el archivo auth.middleware.js, para usar un middleware definido en cualquier otro archivo debemos usar require de la siguiente forma require(‘rutaDelArchivo’). auth.signToken solo será ejecutado si llamamos a la siguiente función desde login de esta forma: next(), lo cual se debe hacer solo si encontramos al usuario iniciar sesión y su contraseña es correcta, además, modificamos el objeto req.user para enviárselo a la siguiente función, ésta es la función del objeto “eq, no solo de recibir objetos de las peticiones http, sino para compartir datos entre middleware, el objeto req.user será utilizado por auth.signToken para generar el token y enviárselo al usuario del lado del cliente.
  2. /register’ que toma solo una función middleware como parámetro, la función register, esto quiere decir que no hay una siguiente función aun si usamos next(), entonces podríamos pensar que el parámetro next no es necesario en la función register, pero no es así, siempre debemos pasar el parámetro next a las funciones middleware, ya que este también se usa para el manejo de errores, puedes ver que al momento de guardar el usuario (user.save(…)) si ocurre algun error llamo a la siguiente función de esta forma next(err), al ejecutar la función next con un error como parámetro no estamos ejecutando el siguiente middleware común, esto es para ejecutar el siguiente middleware para manejo de errores. Si estás interesado en saber mas sobre manejo de errores puedes visitar mi siguiente publicación “Entendiendo el manejo de errores con Express.js”

Terminaremos con una ruta básica para editar los datos de un usuario, esta vez utilizaremos el middleware auth.verifyToken para proteger nuestra ruta, si el token es válido, ejecutaremos la siguiente función para editar los datos del usuario llamando a next(), de lo contrario enviamos un error 403 para indicar que el usuario no esta autorizado para realizar esta llamada.

// user.routes.js

Esta vez el middleware auth.verifyToken se encuentra antes que nuestra función principal, de esta forma podemos utilizarla para proteger nuestra función principal. Es sencillo, la ruta ‘/user/’ llama a la función auth.verifyToken y esta verifica y descodifica el token para obtener el usuario y guardarlo en req.user, luego ejecutamos la siguiente función findByIdAndUpdate para editar el usuario con el _id obtenido del token decodificado, el objeto req.body son los datos enviados desde el cliente para actualizar el usuario.

¡Hemos terminado aquí! Espero haber podido ayudarte a comprender más acerca de la función middleware de express, mantente en línea para obtener más información sobre node.js, express.js y mongodb.