Bienvenidos sean a este post, hoy veremos algo mas sobre lo visto en el post anterior.
Hasta ahora hemos visto dos funciones de middleware, en una el primer argumento es la funcion manejadora, en la otra el primer argumento sera un fragmento de la URL y el segundo es la funcion manejadora, esto lo vemos en app.use que tenemos un primer argumento opcional el cual es el path de middleware donde esta montado, este path es un patron que coincide contra el URL solicitado y la funcion informada es iniciada si el URL coincide con el patron, incluso existe un metodo para pasar parametros en la URL:
app.use('/user/profile/:id', function(req, res, next) {
userProfiles.lookup(req.params.id, (err, profile) => {
if (err) return next(err);
// Instrucciones para trabajar con el perfil
// como mostrarselo al usuario
res.send(profile.display());
});
});
En este caso el path especificado tiene un patron, id, y este se almacenara en req.params.id lo cual usaremos como un parametro de ruteo en Express, este patron coincidira con un segmento del URL y el contenido coincidente se almacenara y estara disponible en el objeto req.params, en este ejemplo brindamos un servicio para el usuario donde mostrariamos e informariamos sobre su perfil en base al id informado.
Express registra las funciones disponibles para ejecutar, esto para intentar coincidir este patron contra la URL solicitada y en caso de coincidir la funcion enrutadora es invocada, pero tambien podemos hacer la coincidencia mediante el metodo HTTP de request, tales como GET o PUT, por lo tanto podemos reemplazar a app.use por app..get o app.put y al ejemplo anteiror reemplazarlo de la siguiente manera:
app.get('/user/profile/:id', function(req, res, next) {
... las mismas instrucciones que antes ...
});
La conducta de GET es recuperar la informacion y el de PUT es almacenar datos, sin embargo en el ejemplo anterior coincidiria cualquiera de los metodos HTTP cuando la funcion manejadora es solo correcta para el verbo GET y en este caso asegura que la aplicacion coincida correctamente con los metodos HTTP deseados, para finalmente obtener el objeto router y este es usado explicitamente para rutear solicitudes basadas en su URL, veamos el siguiente ejemplo:
const express = require('express');
const router = express.Router();
router.get('/', function(req, res, next) {
res.send('Responder con un recurso');
});
module.exports = router;
Lo primero que haremos sera crear un objeto router despues agregaremos una o mas funciones de router, lo cual lo hace disponible a traves de module.exports permitiendo que app.js lo tenga disponible para su uso, en este caso tenemos una sola ruta pero router puede tener muchas mas para poder elegir la mas conveniente.
Mencionamos que el caso anterior tiene una unica ruta y esta coincide una solicitud GET en la raiz del URL, todo esta bien hasta que nos damos cuenta que en routes/index.js tenemos una funcion de router similar que tambien coincide las solicitudes de GET en la misma URL, si volvemos a app.js y tomamos la siguiente linea:
app.use('/users', users);
Y la modificamos de la siguiente manera:
app.use('/users', usersRouter);
Esto hara que este objeto router se monte en la URL /users, con cero o mas funciones de ruteo, y como Express busca por una coincidencia de una funcion de ruteo, y como mencionamos anteriormente primero busca las funciones adjuntadas al objeto app, y cualquier objeto router con sus funciones tambien e invoca cualquier funcion de ruteo que coincida con la solicitud.
Si volvemos al inconveniente con la raiz del URL ahora que el router este montado en /users se convierte en importante dado que ahora la actual URL considera coincidente al punto de montaje (/users) concatenado con la URL en la funcion router, dando como efecto que el prefijo de montaje es removido del URL solicitado para el proposito de coincidir contra las funciones de router en el objeto router y con esto podemos decir que con este punto de montaje una URL como /users/login sera transformada a /login, lo cual permitira que haya una mejor coincidencia con las funciones de router.
En resumen, hoy hemos visto como podemos controlar las solicitudes mediante el objeto router, este es creado por Express, algunas particularidades y algunas fallas en este, y como solucionarlo, espero les haya resultado util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
