sql >> Databáze >  >> NoSQL >> MongoDB

Jak Express ví, kterou cestu směrovače použít, když se shoduje více cest?

Abyste tomu plně porozuměli, přečtěte si prosím dokumentaci:http://expressjs.com/api.html #router.METOD

Jak expresní trasy zachycují cesty

Když použijete :param jako součást vaší cesty odpovídá všemu jako /* a zachycená hodnota je uložena v req.params.param .

Máte-li více než jedno pravidlo, první zaregistrované je to první, proti kterému se kontroluje. Kontroluje každé volání proti každému pravidlu, dokud není nalezena shoda. Pokud zavoláte next() pokud mu nebudou předány žádné hodnoty, bude hledat další shodu (buď ve stejné trase, nebo pokračovat do dalšího middlewaru).

Všechna tato tři pravidla tedy budou spuštěna

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

Když požádám o /user/foobar , uvidím následující výstup (a pravděpodobně chyba jako klienta, protože jsem nikdy neodpověděl :P)

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

Zasáhne všechny tři, ale kontext je u každého jiný.

Jak zachytit vzory cest pomocí regulárních výrazů

Pokud chcete zachytit samostatné cesty pro ID (řekněme všechna čísla) a uživatelské jméno (všechna písmena), můžete to udělat takto:

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

Všimněte si paratézy kolem mé zajatecké skupiny. Bez tohoto params je prázdný. Automaticky snímá pouze pomocí * v řetězci, protože jsou to milí lidé. Když poběžím proti třem různým typům, dostanu následující pro výstup.

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

To vše vysvětlilo, že se otevíráte některým vektorům pro chyby, které zamoří váš systém. Možná budete chtít přemýšlet o vzoru adresy URL.




  1. mongo db agregát randomize ( shuffle ) results

  2. Získání časového razítka z mongodb id

  3. MongoDB:mongoimport ztratí připojení při importu velkých souborů

  4. MongoDB Regex vyhledávání na celočíselné hodnotě