11. Ejemplo [nuxt-08]: middlewares de enrutamiento
En este ejemplo, introducimos el concepto de middlewares de enrutamiento, que son scripts que se ejecutan cada vez que cambia la ruta.
El ejemplo [nuxt-08] se obtiene inicialmente copiando el proyecto [nuxt-01]:

Los middlewares de enrutamiento deben estar en una carpeta llamada [middleware] [2]. Puede haber un enrutamiento de dos niveles:
- un enrutamiento aplicado a cada navegación. Este se declara en el archivo [nuxt.config.js];
- un enrutamiento aplicado a una página concreta, cuando esta es el destino del enrutamiento. Este enrutamiento se declara entonces en dicha página de destino;
11.1. Enrutamiento general
El archivo [middleware / routing.js] se encargará del enrutamiento general. Se declara de la siguiente manera en el archivo [nuxt.config.js]:
router: {
base: '/nuxt-08/',
middleware: ['routing']
},
Los middlewares de enrutamiento general son una propiedad del enrutador (línea 1). Puede haber varios middlewares de enrutamiento. Por eso, en la línea 3, el valor de la propiedad [middleware] es una matriz. Se observa que no se utiliza ninguna ruta para designar el middleware. Se buscará automáticamente en la carpeta [middleware] del proyecto;
El middleware [routing] aquí solo genera registros:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// ¿Quién ejecuta este código?
console.log('[routing], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const routing = '[routing ' + who + ']'
// número de argumentos
console.log(routing + ', il y a', args.length, 'argument(s)')
// primer argumento
const context = args[0]
// claves del contexto
dumpkeys(routing + ', context', context)
// la aplicación
dumpkeys(routing + ', context.app', context.app)
// la ruta
dumpkeys(routing + ', context.route', context.route)
console.log(routing + ', context.route=', context.route)
// el router
dumpkeys(routing + ', context.app.router', context.app.router)
// el router.options.routes
dumpkeys(routing + ', context.app.router.options.routes', context.app.router.options.routes)
console.log(routing + ', context.app.router.options.routes=', context.app.router.options.routes)
}
function dumpkeys(message, object) {
// lista de claves de [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
// lista de claves
if (object) {
console.log(Object.keys(object))
}
}
- línea 3: veremos que el middleware recibe un argumento: el contexto del ejecutor (servidor o cliente);
- líneas 4-25: se muestran las propiedades de diferentes objetos para saber qué se puede utilizar. Veremos que el contexto del middleware es prácticamente idéntico al del plugin;
11.2. Enrutamiento para una página concreta
Queremos controlar la forma en que se accede a la página [index]. Para ello, debemos introducir la propiedad [middleware] en esta página [index]:
<script>
/* eslint-disable no-undef */
/* eslint-disable no-console */
/* eslint-disable nuxt/no-env-in-hooks */
import Navigation from '@/components/navigation'
import Layout from '@/components/layout'
export default {
name: 'Home',
// componentes utilizados
components: {
Layout,
Navigation
},
// ciclo de vida
beforeCreate() {
// cliente y servidor
console.log('[home beforeCreate]')
},
created() {
// cliente y servidor
console.log('[home created]')
},
beforeMount() {
// solo cliente
console.log('[home beforeMount]')
},
mounted() {
// solo cliente
console.log('[home mounted]')
},
// enrutamiento
middleware: ['index-routing']
}
</script>
- línea 34: la propiedad [middleware] enumera los scripts que se deben ejecutar cada vez que la siguiente página que se muestre sea la página [index]. Una vez más, estos scripts se buscarán en la carpeta [middleware] del proyecto;
El middleware [index-routing] es el siguiente:
/* eslint-disable no-undef */
/* eslint-disable no-console */
export default function(...args) {
// ¿Quién ejecuta este código?
console.log('[index-routing], process.server=', process.server, 'process.client=', process.client)
const who = process.server ? 'server' : 'client'
const indexRouting = '[index-routing ' + who + ']'
// número de argumentos
console.log(indexRouting + ', il y a', args.length, 'argument(s)')
// primer argumento
const context = args[0]
// claves del contexto
dumpkeys(indexRouting + ', context', context)
// la aplicación
dumpkeys(indexRouting + ', context.app', context.app)
// la ruta
dumpkeys(indexRouting + ', context.route', context.route)
console.log(indexRouting + ', context.route=', context.route)
// el router
dumpkeys(indexRouting + ', context.app.router', context.app.router)
// el router.options.routes
dumpkeys(indexRouting + ', context.app.router.options.routes', context.app.router.options.routes)
console.log(indexRouting + ', context.app.router.options.routes=', context.app.router.options.routes)
// ¿De dónde venimos?
if (context.from) {
console.log('from=', context.from)
}
}
function dumpkeys(message, object) {
// lista de claves de [object]
const ligne = 'Liste des clés [' + message + ']'
console.log(ligne)
// lista de claves
if (object) {
console.log(Object.keys(object))
}
}
El código de [index-routing] es idéntico al de [routing] y produce los mismos resultados. Lo que nos interesa es ver cuándo se ejecutan estos dos middlewares.
11.3. Ejecución del proyecto
Ejecutamos el proyecto. Los registros son los siguientes:
El servidor ejecuta primero el script [routing]:
Aquí vemos lo mismo que habíamos obtenido con los complementos.
- línea 15: la propiedad [redirect] se utiliza a menudo en los middlewares: permite cambiar el destino del enrutamiento en curso;
A continuación, dado que la página que se va a mostrar es la página [index], el servidor ejecuta el script [index-routing] y muestra los siguientes registros:
Los resultados obtenidos con el script [index-routing] son similares a los obtenidos con el script [routing].
Una vez que el navegador del cliente recibe la página [index], los scripts del cliente toman el control. Los registros pasan a ser los siguientes:
Así pues, vemos que, al iniciar la aplicación, el cliente no ejecuta ningún middleware. Esto significa que esto ocurrirá cada vez que el usuario realice una llamada al servidor. El cliente solo ejecuta los middlewares cuando se navega dentro de la propia aplicación. Naveguemos, por ejemplo, a la página [page1] (estamos en la página [index]) mediante el enlace [Page 1]. Los registros son entonces los siguientes:
- línea 2: el middleware [routing] es ejecutado por el cliente;
- línea 4: fíjate en la propiedad [from]: es la ruta de la que venimos;
- línea 9: [context.route] es la ruta a la que nos dirigimos;
- líneas 15-18: visualización de la página [page1];
Ahora volvamos a la página [index] mediante el enlace [Home]. Los registros son entonces los siguientes:
- líneas 1-15: el cliente ejecuta el middleware [routing]. Esto es normal. Se ejecuta cada vez que cambia la ruta;
- líneas 16-29: el cliente ejecuta el middleware [index-routing], debido a que:
- [index] es el destino de la ruta actual (véase la línea 23);
- la página [index] ha definido un middleware, concretamente [index-routing];
Por lo tanto, se observa que los middlewares de enrutamiento general son ejecutados por el cliente antes que los middlewares asociados a las páginas.