Rutado modular
Imagina este escenario: Tienes una tienda que vende mascotas, y un cliente quiere comprarte conejos y gatos.
Si utilizas los métodos básicos de enrutamiento definidos anteriormente, el código tendrá este aspecto:
Nota que hemos escrito las mismas rutas varias veces.
Sin embargo, escribir las rutas una y otra vez aumenta la redundancia y los errores tipográficos. Además, es útil hacer nuestro código más modular, ya que es una buena práctica.
Como programador, siempre quieres que tu código se vea más limpio. Para facilitar la lectura del código anterior, podemos utilizar dos métodos.
Usando app.route
Aquí es donde entra app.route
. Escribirás la ruta una vez, y puedes encadenar múltiples manejadores de ruta.
Puedes implementar app.route
de la siguiente manera:
app.route(PATH)
.get(callback)
.post(callback)
//can add more HTTP requests (.put, .delete, etc)
Ahora podemos reescribir el código :
El código se ve más limpio, y sólo había que introducir la ruta para cada petición HTTP una vez.
Sin embargo, hay una advertencia más: el parámetro username
existe en todas las rutas. Escribir username
una y otra vez sigue propiciando errores y redundancias. ¿Y si pudiéramos hacerlo aún más modular?
express.Router()
Podemos utilizar express.Router()
para crear manejadores de rutas modulares y montables. Una instancia de Router
es un sistema completo de middleware y enrutamiento, por lo que a menudo se le denomina «miniapp».
Sólo tenemos que especificar el punto de partida, y la instancia de Router
se encargará del resto por nosotros.
Para usar app.Router()
, tenemos que crear un módulo independiente, instanciar una instancia de app.Router
, y luego usar module.exports
para exportar la instancia.
Para más detalles sobre el uso de module.exports
, consulta mi artículo anterior.
En este ejemplo, sólo manejaremos una ruta simple que contendría los parámetros username
y id
.
En routerExample.js
:
Usamos router.route()
, que es similar a app.route
. El módulo definido dice: «Siempre que la ruta vaya a terminar con /:username/:id
, ejecuta el siguiente código definido.»
Para usarlo, utiliza otro módulo, main.js
:
Como dicen los comentarios, usamos app.use
para decirle a routeExample.js
que ejecute las funciones que tienen rutas que empiezan por el primer parámetro. El primer parámetro se puede denominar como punto de partida. Por tanto, la ruta será starting point + PATH defined by router
.
Por ejemplo, según la línea 6, ahora manejaremos las peticiones GET y POST que empiecen por ‘/cats’
. Tendrán la ruta cats/:username/:id
.
Como siempre, puedes utilizar diferentes rutas en el módulo routeExample
, pero lo único que debes especificar es el punto de inicio en app.use
.
Para ejecutar el código, escribe node main
en una ventana de terminal y utiliza cURL
en otra ventana como corresponde.
Diferentes rutas en express.Router con middleware
En este ejemplo, navegaremos a la página de inicio de Birds de nuestra tienda de mascotas y definiremos una función de middleware, timeLog
, que arrojará la hora en que se solicitó la ruta respectiva.
birds.js
:
En main.js
:
var birds = require('./birds')
app.use('/birds', birds) //handle /birds and /birds/about
Utiliza el comando node
para ejecutar el código, luego utiliza cURL
así: