Pour bien comprendre cela, veuillez lire la documentation :http://expressjs.com/api.html #router.METHOD
Comment les itinéraires express capturent les chemins
Lorsque vous utilisez un :param
dans le cadre de votre chemin, il correspond à tout comme /*
, et la valeur capturée est stockée dans req.params.param
.
Lorsque vous avez plusieurs règles, la première enregistrée est la première vérifiée. Il vérifie chaque appel par rapport à chaque règle jusqu'à ce qu'une correspondance soit trouvée. Si vous appelez next()
sans qu'aucune valeur ne lui soit transmise, il recherchera la correspondance suivante (soit dans la même route, soit dans le middleware suivant).
Donc ces trois règles seront toutes exécutées
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);
Lorsque je demande /user/foobar
, je verrai la sortie suivante (et probablement une erreur en tant que client car je n'ai jamais répondu :P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
Il touchera les trois, mais le contexte est différent pour chacun.
Comment capturer des modèles de chemin avec des expressions régulières
Si vous souhaitez capturer des routes distinctes pour l'identifiant (disons tous les chiffres) et le nom d'utilisateur (toutes les lettres), vous pouvez le faire :
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'));
Notez la parathèse autour de mon groupe de capture. Sans cela, params
est vide. Il capture automatiquement avec juste *
dans la ficelle parce que ce sont des gens sympas. J'obtiendrai ce qui suit pour la sortie lorsque j'exécuterai les trois types différents.
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
Tout cela expliqué, vous vous ouvrez à certains vecteurs de bogues pour infester votre système. Vous voudrez peut-être réfléchir à votre modèle d'URL.