{"id":223,"date":"2023-08-18T15:28:10","date_gmt":"2023-08-18T18:28:10","guid":{"rendered":"https:\/\/danielsegovia.com\/plataforma\/?p=223"},"modified":"2023-08-18T15:28:11","modified_gmt":"2023-08-18T18:28:11","slug":"23-middleware","status":"publish","type":"post","link":"https:\/\/danielsegovia.com\/plataforma\/23-middleware\/","title":{"rendered":"23 &#8211; Middleware"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Los middlewares en Node.js son una parte fundamental para desarrollar aplicaciones web eficientes y escalables. Son funciones que se ejecutan en el flujo de solicitud y respuesta de una aplicaci\u00f3n y permiten realizar tareas comunes, como la manipulaci\u00f3n de datos, la autenticaci\u00f3n, la autorizaci\u00f3n, el registro de solicitudes, entre otras. En este art\u00edculo, exploraremos en detalle qu\u00e9 son los middlewares, c\u00f3mo funcionan y c\u00f3mo se pueden implementar en una aplicaci\u00f3n Node.js.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfQu\u00e9 es un Middleware?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">En el contexto de Node.js, un middleware es una funci\u00f3n intermedia que se coloca entre la solicitud (request) que llega a la aplicaci\u00f3n y la respuesta (response) que se enviar\u00e1 al cliente. Estas funciones tienen acceso a los objetos de solicitud y respuesta, y pueden realizar tareas adicionales antes de que la solicitud sea manejada por la ruta final de la aplicaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La arquitectura de middleware permite que las solicitudes pasen a trav\u00e9s de m\u00faltiples capas de procesamiento antes de llegar a su destino final. Esto proporciona una forma modular y flexible de manejar el flujo de la aplicaci\u00f3n, ya que los middlewares pueden agregarse, eliminarse o reorganizarse f\u00e1cilmente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Funcionamiento de los middlewares<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando una solicitud llega a la aplicaci\u00f3n, pasa a trav\u00e9s de una cadena de middlewares antes de ser procesada por la ruta final. Cada middleware puede realizar alguna acci\u00f3n espec\u00edfica y luego decidir si pasar la solicitud al siguiente middleware en la cadena o enviar una respuesta al cliente, lo que detendr\u00eda el flujo de ejecuci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El orden en el que se definen los middlewares es esencial, ya que se ejecutan secuencialmente en el orden en que se agregan a la aplicaci\u00f3n. Por lo tanto, el primer middleware definido ser\u00e1 el primero en ejecutarse y as\u00ed sucesivamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementaci\u00f3n de Middlewares en Node.js<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Existen 2 formas de implementar en middleware, a un endpoint en espec\u00edfico o bien a todos los endpoints<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Aplicar el middleware a un solo endpoint<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">const express = require('express');\nconst app = express();\n\n\/\/ Middleware para una ruta espec\u00edfica\nconst miMiddleware = (req, res, next) =&gt; {\n  console.log('Este middleware se aplica solo a la ruta espec\u00edfica.');\n  next();\n};\n\n\/\/ Ruta final de la aplicaci\u00f3n con el middleware\napp.get('\/ruta-especifica', miMiddleware, (req, res) =&gt; {\n  res.send('Esta es la ruta espec\u00edfica con el middleware aplicado.');\n});\n\n\/\/ Iniciar servidor\napp.listen(3000, () =&gt; {\n  console.log('Servidor en ejecuci\u00f3n en http:\/\/localhost:3000');\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, hemos creado un middleware llamado miMiddleware, y lo hemos aplicado \u00fanicamente a la ruta <strong>\/ruta-especifica<\/strong>. Cada vez que se realice una solicitud a <strong>\/ruta-especifica<\/strong>, el middleware se ejecutar\u00e1 antes de llegar a la ruta final.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Aplicar middleware a todos tus endpoints<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">const express = require('express');\nconst app = express();\n\n\/\/ Middleware para todas las rutas\nconst miMiddleware = (req, res, next) =&gt; {\n  console.log('Este middleware se aplica a todas las rutas.');\n  next();\n};\n\n\/\/ Middleware de registro de solicitudes para todas las rutas\napp.use((req, res, next) =&gt; {\n  console.log(`Solicitud recibida: ${req.method} ${req.url}`);\n  next();\n});\n\n\/\/ Middleware de manejo de errores para todas las rutas\napp.use((err, req, res, next) =&gt; {\n  console.error('Error:', err.stack);\n  res.status(500).send('Algo sali\u00f3 mal en el servidor.');\n});\n\n\/\/ Ruta final de la aplicaci\u00f3n con el middleware\napp.get('\/ruta-1', miMiddleware, (req, res) =&gt; {\n  res.send('Esta es la ruta 1 con el middleware aplicado.');\n});\n\n\/\/ Ruta final de la aplicaci\u00f3n con el middleware\napp.get('\/ruta-2', miMiddleware, (req, res) =&gt; {\n  res.send('Esta es la ruta 2 con el middleware aplicado.');\n});\n\n\/\/ Iniciar servidor\napp.listen(3000, () =&gt; {\n  console.log('Servidor en ejecuci\u00f3n en http:\/\/localhost:3000');\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, hemos utilizado app.use para aplicar un middleware tanto para el registro de solicitudes como para el manejo de errores a todas las rutas de la aplicaci\u00f3n. Cada vez que se realice una solicitud, estos middlewares se ejecutar\u00e1n antes de llegar a la ruta final, sin importar cu\u00e1l sea la ruta solicitada.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Uso de next() en Middlewares<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">En los ejemplos anteriores, hemos visto que utilizamos next() en el middleware para pasar al siguiente middleware en la cadena o a la ruta final. next() es una funci\u00f3n proporcionada por Express.js que se utiliza para controlar el flujo de ejecuci\u00f3n y permitir que la solicitud contin\u00fae avanzando a trav\u00e9s de la cadena de middlewares.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si no llamamos a next(), el flujo de ejecuci\u00f3n quedar\u00e1 bloqueado en ese middleware y la solicitud no llegar\u00e1 a la ruta final o al siguiente middleware. Esto puede ser \u00fatil, por ejemplo, para implementar l\u00f3gica de autorizaci\u00f3n en un middleware y detener la ejecuci\u00f3n si el usuario no tiene permisos para acceder a ciertas rutas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Manejo de Errores<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente ejemplo muestra c\u00f3mo se puede crear un middleware para el manejo de errores en una aplicaci\u00f3n Express.js:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">const express = require('express');\nconst app = express();\n\n\/\/ Middleware para manejo de errores\nconst errorHandler = (err, req, res, next) =&gt; {\n  console.error('Error:', err.stack);\n  res.status(500).send('Algo sali\u00f3 mal en el servidor.');\n};\n\n\/\/ Ruta final de la aplicaci\u00f3n con error intencional\napp.get('\/error', (req, res, next) =&gt; {\n  const error = new Error('Este es un error intencional');\n  next(error);\n});\n\n\/\/ Aplicar middleware de manejo de errores a todas las rutas\napp.use(errorHandler);\n\n\/\/ Iniciar servidor\napp.listen(3000, () =&gt; {\n  console.log('Servidor en ejecuci\u00f3n en http:\/\/localhost:3000');\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, hemos creado un middleware errorHandler para manejar errores. Cuando se realiza una solicitud a la ruta \/error, el middleware lanza un error intencional utilizando next(error). El middleware de manejo de errores capturar\u00e1 ese error y responder\u00e1 con un mensaje gen\u00e9rico de error en el servidor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este es solo un ejemplo b\u00e1sico de manejo de errores, pero en una aplicaci\u00f3n real, este middleware podr\u00eda registrar errores en un archivo de registro o notificar al equipo de desarrollo sobre problemas cr\u00edticos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparate para la siguiente clase.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En la siguiente clase veremos m\u00e1s aplicaciones de middlewares y como nos pueden ayudar en nuestras aplicaciones.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los middlewares en Node.js son una parte fundamental para desarrollar aplicaciones web eficientes y escalables. Son funciones que se ejecutan en el flujo de solicitud y respuesta de una aplicaci\u00f3n y permiten realizar tareas comunes, como la manipulaci\u00f3n de datos, la autenticaci\u00f3n, la autorizaci\u00f3n, el registro de solicitudes, entre otras. En este art\u00edculo, exploraremos en &#8230; <a title=\"23 &#8211; Middleware\" class=\"read-more\" href=\"https:\/\/danielsegovia.com\/plataforma\/23-middleware\/\" aria-label=\"Leer m\u00e1s sobre 23 &#8211; Middleware\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,3],"tags":[],"class_list":["post-223","post","type-post","status-publish","format-standard","hentry","category-backend-con-node-js","category-curso-de-node-js"],"_links":{"self":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts\/223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/comments?post=223"}],"version-history":[{"count":4,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts\/223\/revisions"}],"predecessor-version":[{"id":692,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts\/223\/revisions\/692"}],"wp:attachment":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/media?parent=223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/categories?post=223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/tags?post=223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}