За да разберете напълно това, моля, прочетете документацията:http://expressjs.com/api.html #router.METHOD
Как Express Routes улавят пътища
Когато използвате :param
като част от вашия път, той съвпада с всичко като /*
, а уловената стойност се съхранява в req.params.param
.
Когато имате повече от едно правило, първото регистрирано е първото, спрямо което се проверява. Той проверява всяко повикване спрямо всяко правило, докато се намери съвпадение. Ако извикате next()
без да му се предават стойности, той ще търси следващото съвпадение (или по същия маршрут, или ще продължи към следващия междинен софтуер).
Така че тези три правила ще бъдат изпълнени
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);
Когато поискам /user/foobar
, ще видя следния резултат (и вероятно грешка като клиент, защото така и не отговорих :P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
Ще удари и трите, но контекстът е различен за всеки.
Как да заснемате шаблони на пътища с регулярни изрази
Ако искате да заснемете отделни маршрути за id (да кажем всички числа) и потребителско име (всички букви), можете да направите това:
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'));
Обърнете внимание на паратезата около моята група за улавяне. Без това, params
празно е. Той автоматично улавя само с *
в низа, защото те са хубави хора. Ще получа следното за изход, когато стартирам срещу трите различни типа.
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
Всичко това обяснено, вие се отваряте към някои вектори за грешки, които да заразят вашата система. Може да искате да помислите върху вашия URL модел.