2017-01-19 47 views
7

Używam Express do obsługi trasy w formacie /articles/:year/:month/:day, gdzie rok, miesiąc i dzień są opcjonalne.Wiele opcjonalnych parametrów trasy w Expressie?

  • Jeśli nie zostanie podany żaden z trzech parametrów, wszystkie artykuły zostaną zwrócone;
  • Jeśli zostanie podany rok, artykuły z tego roku zostaną zwrócone;
  • Jeśli zostanie podany rok i miesiąc, artykuły z tego roku i miesiąca zostaną zwrócone;
  • Jeśli zostaną podane wszystkie trzy parametry, artykuły z tego roku, miesiąca i dnia zostaną zwrócone.

Moje pytanie brzmi: jak mogę je ustawić jako opcjonalne? Przy obecnej trasie, którą zdefiniowałem, chyba że wszystkie trzy parametry są obecne, nie będzie można go rozwiązać i wpadnie w domyślną trasę.

+0

Można zdefiniować wiele tras dla przypadku, gdy rok jest obecny, rok i miesiąc są obecne, wszystkie parametry są obecni i nikt nie jest obecny, czy można przenieść parametry kwerendy ciąg –

+0

Można również przekazać je opcjonalnie umieszczając "?" po nich – hjpotter92

+0

@VsevolodGoloviznin Dzięki za porady. Są naprawdę pomocne i pasują do mojego przypadku użycia. Ostatecznie wybrałem rozwiązanie z hjpotter92, ponieważ jest ono również ciche, eleganckie i skutkuje krótszym kodowaniem. Jeszcze raz dziękuję za pomoc. – CLDev

Odpowiedz

11

expressjs's guide do routingu wspomina:

Express korzysta path-to-regexp do dopasowania ścieżki trasy; zapoznaj się z dokumentacją ścieżki do regexp dla wszystkich możliwości definiowania ścieżek trasy. Express Route Tester to poręczne narzędzie do testowania podstawowych tras , mimo że nie obsługuje dopasowywania wzorców.

Zasadniczo można użyć znaku ?, aby parametr był opcjonalny.

/articles/:year?/:month?/:day? 
7

Edytowany dla własnego użytku posiadanie 3 różnych opcji w jednej odpowiedzi. Podziękowania dla @ hjpotter92 za odpowiedź na wyrażenie regularne.

Z URL Params

Z regex

app.get('/articles/:year?/:month?/:day?', function(req, res) { 
    var year = req.query.year; //either a value or undefined 
    var month = req.query.month; 
    var day = req.query.day; 
} 

Bez regex

var getArticles = function(year, month, day) { ... } 

app.get('/articles/:year', function(req, res) { 
    getArticles(req.params.year); 
} 
app.get('/articles/:year/:month', function(req, res) { 
    getArticles(req.params.year, req.params.month); 
} 
app.get('/articles/:year/:month/:day', function(req, res) { 
    getArticles(req.params.year, req.params.month, req.params.day); 
} 

definiujących część 3 Ścieżki chcesz obsługiwać i wykorzystywać tę samą funkcję

Z Zapytanie Params

app.get('/articles', function(req, res) { 
    var year = req.query.year; //either a value or undefined 
    var month = req.query.month; 
    var day = req.query.day; 
} 

URL dla tego punktu końcowego będzie wyglądać następująco:

http://localhost/articles?year=2016&month=1&day=19 
+0

Bardzo dziękuję za pomoc. Myślę, że doskonale radzą sobie z moim przypadkiem użycia (zwłaszcza propozycja na wielu trasach), tylko że hjpotter92 zasugerował jeszcze prostsze rozwiązanie. Jeszcze raz dziękuję za pomoc! – CLDev

+0

Pomogło mi to w osiągnięciu sukcesu –