MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

W jaki sposób Express wie, której ścieżki routera użyć, gdy wiele ścieżek jest zgodnych?

Aby w pełni to zrozumieć, przeczytaj dokumentację:http://expressjs.com/api.html #router.METODA

Jak Express Routes przechwytują ścieżki

Kiedy używasz :param jako część Twojej ścieżki pasuje do wszystkiego, jak /* , a przechwycona wartość jest przechowywana w req.params.param .

Jeśli masz więcej niż jedną regułę, pierwsza zarejestrowana jest pierwszą sprawdzaną. Sprawdza każde wywołanie pod kątem każdej reguły, dopóki nie zostanie znalezione dopasowanie. Jeśli wywołasz next() bez przekazanych wartości, będzie szukał następnego dopasowania (albo na tej samej trasie, albo przejdzie do następnego oprogramowania pośredniego).

Tak więc wszystkie te trzy reguły zostaną uruchomione

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

Kiedy żądam /user/foobar , zobaczę następujące wyjście (i prawdopodobnie błąd jako klient, ponieważ nigdy nie odpowiedziałem :P)

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

Uderzy we wszystkie trzy, ale kontekst jest inny dla każdego.

Jak przechwytywać wzorce ścieżek za pomocą wyrażeń regularnych

Jeśli chcesz przechwycić oddzielne trasy dla identyfikatora (powiedzmy, że wszystkie liczby) i nazwy użytkownika (wszystkie litery), możesz to zrobić:

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

Zwróć uwagę na paratezę wokół mojej grupy przechwytującej. Bez tego params jest pusty. Automatycznie przechwytuje za pomocą zaledwie * w łańcuchu, ponieważ są miłymi ludźmi. Otrzymam następujące dane wyjściowe, gdy będę działał z trzema różnymi typami.

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

Wszystko to zostało wyjaśnione, otwierasz się na pewne wektory dla błędów, które mogą zaatakować twój system. Być może zechcesz pomyśleć o wzorcu adresu URL.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongoDB - średnia z wartości tablicy

  2. Jak utworzyć kanał JSON z kolekcji MongoDB?

  3. Przedstawiamy wykresy wyszukiwania w MongoDB

  4. Mongusta:schemat kontra model?

  5. junit przypadki testowe przy użyciu osadzania mongodb de.flapdoodle.embed.mongo