sql >> Database >  >> NoSQL >> MongoDB

Hoe weet Express welk routerpad moet worden gebruikt wanneer meerdere paden overeenkomen?

Lees de documentatie om dit volledig te begrijpen:http://expressjs.com/api.html #router.METHODE

Hoe Express Routes paden vastleggen

Wanneer u een :param . gebruikt als onderdeel van je pad komt het overeen met alles zoals /* , en de vastgelegde waarde wordt opgeslagen in req.params.param .

Als u meer dan één regel heeft, is de eerste geregistreerde de eerste die wordt gecontroleerd. Het controleert elke oproep aan elke regel totdat er een match is gevonden. Als je next() . aanroept zonder dat er waarden aan worden doorgegeven, zoekt het naar de volgende overeenkomst (hetzij in dezelfde route, hetzij doorgaan naar de volgende middleware).

Deze drie regels worden dus allemaal uitgevoerd

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

Wanneer ik /user/foobar vraag , ik zie de volgende uitvoer (en waarschijnlijk een fout als klant omdat ik nooit heb gereageerd :P)

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

Het raakt alle drie, maar de context is voor elk anders.

Padpatronen vastleggen met reguliere expressies

Als u afzonderlijke routes voor id (laten we zeggen alle cijfers) en gebruikersnaam (alle letters) wilt vastleggen, kunt u dit doen:

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

Let op de parathese rond mijn capture-groep. Zonder dit, params is leeg. Het legt automatisch vast met slechts * in de string omdat het aardige mensen zijn. Ik krijg het volgende als uitvoer wanneer ik de drie verschillende typen tegenkom.

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

Dat alles uitgelegd, je stelt jezelf bloot aan een aantal vectoren voor bugs om je systeem te besmetten. Misschien wilt u nadenken over uw URL-patroon.




  1. Omgaan met schemawijzigingen in Mongoose

  2. hoe kan ik mijn mongodb-query maken op basis van de invoer van de gebruiker in node.js?

  3. Een subdocumentverzameling opvragen met MongoDB en C#-stuurprogramma

  4. Nodejs Mongoose render twee modellen uit collecties