For fuldt ud at forstå dette, læs venligst dokumentationen:http://expressjs.com/api.html #router.METODE
Hvordan ekspresruter fanger stier
Når du bruger en :param
som en del af din sti matcher den alt som /*
, og den registrerede værdi gemmes i req.params.param
.
Når du har mere end én regel, er den første, der er registreret, den første, der kontrolleres mod. Den kontrollerer hvert opkald i forhold til hver regel, indtil der er fundet et match. Hvis du kalder next()
uden værdier videregivet til den, vil den lede efter det næste match (enten på samme rute eller fortsætte til næste middleware).
Så disse tre regler vil alle blive kørt
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);
Når jeg anmoder om /user/foobar
, jeg vil se følgende output (og sandsynligvis en fejl som klient, fordi jeg aldrig svarede :P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
Det vil ramme alle tre, men konteksten er forskellig for hver.
Sådan indfanger du stimønstre med regulære udtryk
Hvis du vil fange separate ruter for id (lad os sige alle tal) og brugernavn (alle bogstaver), kan du gøre dette:
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'));
Bemærk paratesen omkring min fangegruppe. Uden dette, params
er tom. Den optager automatisk med kun *
i snoren, fordi de er søde mennesker. Jeg får følgende til output, når jeg kører mod de tre forskellige typer.
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
Alt det forklarede, du åbner dig selv for nogle vektorer for fejl, der kan angribe dit system. Måske vil du tænke over dit URL-mønster.