MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como o Express sabe qual caminho de roteador usar quando vários caminhos correspondem?


Para entender isso completamente, leia a documentação:http://expressjs.com/api.html #roteador.MÉTODO

Como as rotas expressas capturam caminhos


Quando você usa um :param como parte do seu caminho, ele corresponde a tudo como /* , e o valor capturado é armazenado em req.params.param .

Quando você tem mais de uma regra, a primeira registrada é a primeira verificada. Ele verifica cada chamada em relação a cada regra até que uma correspondência seja encontrada. Se você chamar next() sem valores passados ​​para ele, ele procurará a próxima correspondência (na mesma rota ou continuará no próximo middleware).

Então essas três regras serão todas executadas
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);

Quando eu solicito /user/foobar , verei a seguinte saída (e provavelmente um erro como cliente porque nunca respondi :P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar

Ele atingirá todos os três, mas o contexto é diferente para cada um.

Como capturar padrões de caminho com expressões regulares


Se você deseja capturar rotas separadas para id (digamos, todos os números) e nome de usuário (todas as letras), você pode fazer isso:
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'));

Observe a paratese em torno do meu grupo de captura. Sem isso, params está vazia. Ele captura automaticamente com apenas * na corda porque eles são gente boa. Obterei o seguinte para saída quando executar os três tipos diferentes.
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1

Tudo isso explicado, você está se abrindo para alguns vetores de bugs que infestam seu sistema. Talvez queira pensar no seu padrão de URL.