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.