Para comprender completamente esto, lea la documentación:http://expressjs.com/api.html #router.MÉTODO
Cómo capturan rutas Express Routes
Cuando usas un :param
como parte de su ruta, coincide con todo como /*
, y el valor capturado se almacena en req.params.param
.
Cuando tiene más de una regla, la primera registrada es la primera que se comprueba. Comprueba cada llamada con cada regla hasta que se encuentra una coincidencia. Si llama a next()
sin valores pasados, buscará la siguiente coincidencia (ya sea en la misma ruta o continuará en el siguiente middleware).
Entonces estas tres reglas se ejecutarán
var handleRoute = function(req, res, next){
console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]);
next();
}
route.route('/user/:id').get(handleRoute);
route.route('/user/:user').get(handleRoute);
route.route('/user/*').get(handleRoute);
Cuando solicito /user/foobar
, veré el siguiente resultado (y probablemente un error como cliente porque nunca respondí :P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
Afectará a los tres, pero el contexto es diferente para cada uno.
Cómo capturar patrones de ruta con expresiones regulares
Si desea capturar rutas separadas para la identificación (digamos todos los números) y el nombre de usuario (todas las letras), puede hacer esto:
var handleRoute = function(tag) {
return function(req, res, next) {
console.log(tag + ' ' + req.path + ' -> ' + req.params[0]);
res.status(200)
.json({
success: 'yay!'
});
};
};
route.route(/^\/user\/([0-9]+)$/i)
.get(handleRoute('id'));
route.route(/^\user\/([A-Za-z]+)$/i)
.get(handleRoute('user'));
route.route('/user/*')
.get(handleRoute('catch all'));
Tenga en cuenta la parátesis alrededor de mi grupo de captura. Sin esto, params
esta vacio. Se captura automáticamente con solo *
en la cuerda porque son buena gente. Obtendré lo siguiente para la salida cuando corra contra los tres tipos diferentes.
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
Todo eso explicado, te estás abriendo a algunos vectores de errores para infestar tu sistema. Es posible que desee pensar en su patrón de URL.