sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo sabe Express qué ruta de enrutador usar cuando coinciden varias rutas?

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.