‫-: En este video, creemos un
‫tipo especial de middleware llamado param middleware.
‫Entonces, el middleware param es un middleware que solo se
‫ejecuta para ciertos parámetros, así que
‫básicamente, cuando tenemos un cierto parámetro en nuestra URL.
‫Ahora, en nuestro ejemplo aquí, el único
‫parámetro que podríamos tener en la URL de nuestra ruta es la identificación, ¿verdad?
‫Y entonces podemos escribir middleware que
‫solo se ejecute cuando esta identificación esté presente
‫en la URL, está bien, déjame mostrarte cómo hacerlo.
‫En realidad, es bastante simple, por lo que está
‫en nuestro enrutador y luego en el método param, está bien.
‫Y aquí especificamos primero el parámetro que realmente
‫queremos buscar, así que básicamente el parámetro
‫para el que se
‫ejecutará este middleware, y se llama id, y luego,
‫por supuesto, nuestra función de middleware real.
‫Y, como de costumbre, tenemos acceso a la solicitud
‫y al objeto de
‫respuesta, y luego detecta una función
‫de middleware también para la siguiente función, ¿verdad?
‫Ahora, en una función
‫de middleware param, en realidad tenemos acceso a un cuarto
‫argumento y ese es el valor del parámetro en cuestión.
‫Por eso solemos llamarlo val, que significa valor.
‫Y ahora podemos continuar y simplemente
‫iniciar sesión en la
‫consola, solo para ver si esto realmente funciona, así que digamos que
‫Tour id es y luego id, ¿verdad?
‫A continuación, también tenemos que llamar a continuación, ¿verdad?
‫Porque, de lo contrario, el ciclo de
‫respuesta a la solicitud se atascará
‫en esta función de middleware y no podrá
‫pasar al siguiente middleware de la pila, ¿verdad?
‫Cuáles serán estas rutas aquí abajo.
‫Muy bien, vamos a guardarlo y verlo ahora.
‫Y queremos que no sea
‫para todos los usuarios, sino para obtener un Tour, ¿verdad?
‫Bueno, déjame mostrarte primero
‫lo que sucede si no tenemos ninguna identificación, está bien, y ahora, no
‫vemos ningún inicio de sesión en nuestra consola.
‫Pero si ahora envié la misma solicitud
‫en esta ruta donde tenemos la identificación, veamos qué sucede entonces.
‫Oh, me dice que id no está definido,
‫y de hecho no es id, así que fue un error estúpido.
‫Entonces es val por valor, ¿verdad?
‫Entonces, recuerde cómo dije que este parámetro de valor es
‫el que realmente contendrá
‫el valor del parámetro de identificación, y por
‫supuesto, ese es el que debemos usar
‫aquí para obtener acceso a esa identificación.
‫Intentémoslo de nuevo, y ahora tenemos
‫el ID del Tour es dos, ¿verdad?
‫Entonces ese registro vino directamente de esta función aquí.
‫Ahora, lo que también quiero
‫mostrarles es que esta función de middleware no
‫se ejecutará para ninguna de las rutas de los usuarios.
‫Entonces, digamos que llamamos a un usuario con una identificación específica,
‫así que continuemos y copiemos
‫este aquí, creemos una nueva solicitud con una identificación
‫y déjeme guardarla también.
‫Así que obtenga usuario y guarde a usuario, y cuando lo envíe aquí obtenemos
‫nuestra respuesta estándar de que
‫esta ruta no está definida, pero también
‫verá que no tenemos un registro como antes.
‫Y eso se debe, por supuesto, a que esta función de
‫middleware solo se especifica en nuestro enrutador de viaje.
‫Entonces, en este tipo de mini aplicación local,
‫nuevamente, esa es la analogía que me gusta hacer.
‫Básicamente, cada enrutador es
‫una especie de mini subaplicación, una para cada recurso.
‫Y dado que este middleware solo se especifica en este
‫enrutador, entonces, por supuesto,
‫es solo una parte de la
‫pila de middleware si realmente estamos dentro de esta sub-aplicación.
‫¿Tiene sentido?
‫Supongamos que tenemos una solicitud entrante en tours / id.
‫Entonces, esa solicitud pasará por todos estos middleware, primero
‫este middleware, luego este, luego este middleware,
‫luego este, entonces todos estos son parte de
‫la pila de middleware y finalmente
‫llegará a este middleware y ya que
‫esto es en realidad
‫la ruta, luego entrará en el middleware tourRouter.
‫Está bien, y desde allí pasa directamente a este middleware,
‫y entonces se ejecutará este código.
‫Y nuevamente, eso es solo porque tiene una identificación en la ruta.
‫Si no, bueno, entonces esto simplemente se ignoraría
‫y pasaría directamente al siguiente middleware
‫en la pila, así que estos aquí abajo, ¿verdad?
‫Genial, así es como funciona el middleware param; pero por
‫ahora no es realmente tan útil.
‫Pero en realidad podemos usarlo
‫para un caso de uso muy práctico aquí.
‫Así que vayamos a nuestras funciones de controlador aquí
‫y verá que en todas las funciones de
‫controlador que realmente usan la identificación, verificamos si la identificación es válida.
‫Así que lo hacemos aquí en get tour, y también
‫lo hacemos en update tour, así que aquí, y en delete tour.
‫Entonces, estas tres funciones tienen este código muy
‫similar donde verifican si la identificación
‫es válida y, si no, envían esta respuesta de identificación no válida.
‫Tenemos todo este código en el mismo
‫lugar y, como ya sabe, no es una buena
‫práctica repetir el código, por lo que lo que podemos
‫hacer aquí es usar el concepto de middleware
‫param; y realice esta verificación aquí en un middleware externo
‫que se ejecutará antes de
‫que la solicitud llegue a estas funciones del controlador.
‫Así que sigamos adelante y copiemos o
‫realmente cortemos el código desde aquí y creemos una
‫nueva función de middleware llamada checkID, y por supuesto también necesito exportar eso.
‫Entonces, checkID y tenemos acceso, solicitud, respuesta, siguiente y nuevamente,
‫tenga en cuenta que es un middleware param y,
‫por lo tanto, el cuarto argumento será
‫el valor del parámetro.
‫De acuerdo, pégalo aquí y luego
‫no olvides llamar a next al final del middleware, ¿de acuerdo?
‫Y lo que también es muy
‫importante es que tenemos esta declaración de retorno
‫aquí, porque si no tuviéramos este retorno aquí,
‫bueno, entonces express enviaría esta respuesta de regreso pero aún
‫así continuaría ejecutando
‫el código en esta función.
‫Y así, después de
‫enviar la respuesta, seguirá presionando la siguiente
‫función y pasará al siguiente middleware
‫y luego enviará otra respuesta al cliente.
‫Pero eso realmente no está permitido,
‫así que recuerde que en realidad nos encontramos con este error
‫antes, donde nos decía que no podíamos
‫enviar encabezados después de que la respuesta ya había sido enviada.
‫Y ese es el tipo
‫de error con el que nos encontraríamos
‫si no tuviéramos esta declaración de retorno, está bien.
‫Entonces, nuevamente, asegúrese de que después de enviar esta
‫respuesta, la función regrese para que
‫termine y nunca llame a esto a continuación.
‫Así que nunca lo olvides, pero,
‫por supuesto, lo haremos
‫varias veces durante el resto del
‫curso, así que te acostumbrarás a este tipo de patrón.
‫Así que sigamos adelante y eliminemos este código repetido de todas
‫estas otras funciones, así
‫que aquí lo tenemos de nuevo, y sí.
‫También quiero este código aquí solo para
‫asegurarme de que la función se
‫esté ejecutando realmente, y está bien, así que ahora podemos deshacernos de
‫esto aquí y reemplazarlo con nuestra función de controlador recién creada.
‫Entonces tourController, checkID,
‫así que veamos eso
‫ahora, y bueno nuevamente, solo para asegurarnos de
‫que no se ejecute
‫donde no tenemos una identificación, por lo que no tenemos un registro
‫aquí, por lo que todo sigue funcionando en ese lado.
‫Y ahora haga un recorrido con una identificación
‫regular, por lo que una identificación válida, y veamos.
‫Bueno, obtenemos que el ID de Tour es
‫log, y eso significa que
‫si realmente ejecutó nuestro middleware checkID, ¿verdad?
‫Y si ahora probamos con una
‫identificación no válida, entonces obtenemos nuestro mensaje de identificación
‫no válida, el código de error 404 y, por supuesto, nuestra identificación de viaje.
‫Hagamos lo mismo con el parche,
‫ya tenemos una ID
‫inválida aquí y también se ejecuta en esta.
‫Entonces, perfecto, ¿verdad?
‫Entonces, ya no tenemos el código checkID en el
‫controlador de actualización que acabamos de invocar básicamente, pero aún
‫así nuestra ID está verificada
‫porque tenemos ese middleware, así que esto aquí.
‫Tenemos ese middleware en la
‫pila antes de que llegue a la actualización tourController.
‫Entonces, este middleware ahora es parte de nuestra canalización como
‫puede imaginarlo, ahora podría argumentar que simplemente
‫podríamos crear una función simple que también
‫podría verificar el ID y
‫llamar a esa función dentro de cada
‫una de estas funciones de recorrido, y luego llamar dentro
‫de cada uno de estos controladores turísticos relevantes; pero eso realmente
‫iría en contra
‫de la filosofía de express, donde siempre deberíamos trabajar con
‫la pila de middleware, por lo que con
‫esta canalización tanto como podamos, está bien, y estas funciones aquí, no
‫tienen que preocuparse en absoluto por la validación.
‫Cada una de estas funciones tiene un solo propósito, que
‫es hacer lo que dicen, por
‫lo que esta solo obtiene
‫el recorrido, esta solo crea un recorrido, esta solo se
‫actualiza y esta simplemente elimina, no marca, no
‫No tienes que preocuparte por nada de eso.
‫Y si ahora agregamos otro
‫controlador aquí también dependiendo de la identificación, entonces eso
‫también verificaría automáticamente si la identificación no
‫es válida sin que tengamos que hacer ningún paso adicional.
‫Entonces, esto automáticamente buscará la identificación y
‫eso es realmente útil y también cómo deberían
‫funcionar las aplicaciones exprés, genial.
‫Así que tenemos otra herramienta en nuestra caja de herramientas express
‫que ahora podemos usar para escribir nuestras aplicaciones express.