sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur vet Express vilken routersökväg som ska användas när flera vägar matchar?

För att helt förstå detta, läs dokumentationen:http://expressjs.com/api.html #router.METOD

Hur expressrutter fångar upp sökvägar

När du använder en :param som en del av din väg matchar den allt som /* , och det fångade värdet lagras i req.params.param .

När du har mer än en regel är den första registrerade den första som kontrolleras mot. Den kontrollerar varje samtal mot varje regel tills en matchning hittas. Om du anropar next() utan att några värden skickas till den kommer den att leta efter nästa matchning (antingen på samma rutt eller fortsätta till nästa mellanprogram).

Så dessa tre regler kommer alla att köras

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 jag begär /user/foobar , jag ser följande utdata (och förmodligen ett fel som klient eftersom jag aldrig svarade :P)

/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar

Det kommer att träffa alla tre, men sammanhanget är olika för var och en.

Hur man fångar sökvägsmönster med reguljära uttryck

Om du vill fånga separata rutter för id (låt oss säga alla siffror) och användarnamn (alla bokstäver), kan du göra så här:

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'));

Notera paratesen kring min fångstgrupp. Utan detta, params är tom. Den fångar automatiskt med bara * i strängen för att de är trevliga människor. Jag får följande för utdata när jag kör mot de tre olika typerna.

id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1

Allt som förklaras, du öppnar dig för några vektorer för buggar som kan angripa ditt system. Kanske vill tänka på ditt webbadressmönster.




  1. Duplicera en nyckel i redis

  2. Introduktion till Redis

  3. MongoDB sorterar dokument efter arrayelement

  4. MongoDB dataintegritet