sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan ved Express, hvilken routersti der skal bruges, når flere stier matcher?

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.




  1. Hent feltværdi fra array af underdokument

  2. Admin panel for Node.js og Mongoose

  3. Caching af JSON-objekter på serversiden

  4. Tilføj element til MongoDB-dokumentarray i PyMongo uden genindsættelse