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.