express.js - pojedynczy program obsługi routingu dla wielu tras w jednej linii

109

Czy istnieje sposób, aby to zrobić w pojedynczym wywołaniu funkcji?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

Coś jak:

app.get("/", "/blabla", "/blablablabla", todo );

Wiem, że to bałagan składniowy, ale tylko po to, aby dać wyobrażenie o tym, co chciałbym osiągnąć, tablica tras byłaby niesamowita!

Czy ktoś wie, jak to zrobić?

Aronis Mariano
źródło
2
Powinieneś być w stanie napisać wyrażenie regularne, które będzie pasować do wszystkich tras, które chcesz skierować do rzeczy do zrobienia, i użyć wyrażenia regularnego jako punktu końcowego. Może to wyglądać niechlujnie, ale zadziała. Nie publikuję tego jako odpowiedzi, ponieważ nie jestem pewien, jakie byłoby wyrażenie regularne, a to jest bardziej nacisk w tym kierunku. Jest wzmianka o używaniu wyrażeń regularnych w dokumentach tutaj: expressjs.com/api.html#app.VERB
Nick Mitchinson
nie mam doświadczenia z wyrażeniami regularnymi w JS ... nie warto spróbować ... ale każda inna opcja jest mile widziana!
Aronis Mariano
1
Ja też nie mam zbyt wiele, i szczerze mówiąc, nie dałem tego wam po prostu, jednak rozumiem, że wyrażenia regularne są dość uniwersalne; Express powinien analizować twoje wyrażenia prawie tak samo, jak każdy inny język.
Nick Mitchinson,
1
Wyrażenia regularne są bardzo potężne i zdecydowanie warte poznania. Oto rozwiązanie: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- type ',' text / plain ') .send ("Dopasowane:'" + dopasowane + "'");}); Kilka rzeczy: 1. wyrażenie regularne zaczyna się i kończy znakiem /, więc wszelkie znaki / znaki muszą zostać zmienione. 2. ^ char dopasowuje początek łańcucha, znak $ char dopasowuje koniec łańcucha. Bez nich mecz zakończy się sukcesem nawet z dodatkowymi znakami na początku lub na końcu ścieżki, np. / X / blablaxxx
John Deighan.

Odpowiedzi:

132

Natknąłem się na to pytanie, szukając tej samej funkcjonalności.

@Jonathan Ong wspomniał w powyższym komentarzu, że używanie tablic jako ścieżek jest przestarzałe, ale zostało wyraźnie opisane w Express 4 i działa w Express 3.x. Oto przykład czegoś do wypróbowania:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

Od wewnątrz requestobiektu, ścieżką /hooplul/poo?bandle=froo&bandle=pee&bof=blarg:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

Zwróć uwagę, co dzieje się z parametrami: zdaje sobie sprawę z grup przechwytywania i parametrów we wszystkich możliwych ścieżkach, niezależnie od tego, czy są one używane w bieżącym żądaniu.

Tak więc układanie wielu ścieżek w macierz można łatwo wykonać, ale efekty uboczne są prawdopodobnie nieprzewidywalne, jeśli masz nadzieję, że uda ci się znaleźć coś pożytecznego ze ścieżki, która została użyta przez parametry lub grupy przechwytywania. Prawdopodobnie jest to bardziej przydatne do redundancji / aliasingu, w takim przypadku będzie działać bardzo dobrze.

Edycja: zobacz również odpowiedź @ c24w poniżej .

Edycja 2: To jest średnio popularna odpowiedź. Pamiętaj, że ExpressJS, podobnie jak większość bibliotek Node.js, to ruchoma uczta. Chociaż powyższy routing nadal działa (używam go w tej chwili, bardzo przydatna funkcja), nie mogę ręczyć za wyjście obiektu żądania (z pewnością różni się od tego, co opisałem). Przetestuj dokładnie, aby upewnić się, że uzyskasz pożądane wyniki.

Kevin Teljeur
źródło
58
app.get('/:var(bla|blabla)?', todo)

:varustawia to req.param, czego nie używasz. jest używany tylko w tym przypadku do ustawiania wyrażenia regularnego.

(bla|blabla)ustawia wyrażenie regularne do dopasowania, więc dopasowuje ciągi blai blablah.

?sprawia, że ​​całe wyrażenie regularne jest opcjonalne, więc również pasuje /.

Jonathan Ong
źródło
1
/bla(bla)?działa również, ale parametry po nie są prawidłowo wypełniane (tj. /bla(bla)?/:valuenie są wypełniane req.params.value). Czy ktoś wie, dlaczego?
joscarsson
Jeśli używasz ekspresu, możesz go uzyskać, req.params.varale musisz się upewnić, że reqprzeszedłeś do funkcji
Matt The Ninja
51

W rzeczywistości możesz przekazywać szereg ścieżek , tak jak wspomniałeś, i działa świetnie:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
Alex
źródło
28
Jaki jest zamiennik tego, że jest to przestarzałe?
brandonscript
5
@JonathanOng Mówisz, że to jest przestarzałe, a remus pyta, jakie jest zastąpienie. Czy mógłbyś odpowiedzieć na jego / jej pytanie?
nbro
router.route (['/ mailer / out / system', '/ mailer / out / payment']) działa dobrze w programie Express 4 brak ostrzeżenia o wycofaniu
danday74
2
@JonathanOng przeglądanie aktualnych dokumentów Express v4 przy użyciu tablicy nie wydaje się być przestarzałe.
Jason Axelson
32

Aby rozwinąć odpowiedź Kevina , to pochodzi z dokumentów 4.x :

Ścieżka, dla której wywoływana jest funkcja oprogramowania pośredniego; może być dowolnym z:

  • Ciąg reprezentujący ścieżkę.
  • Wzór ścieżki.
  • Wzorzec wyrażenia regularnego dopasowany do ścieżek.
  • Tablica kombinacji dowolnych z powyższych.

Mają kilka przykładów , w tym:

To pasuje do ścieżki zaczynając /abcd, /xyza, /lmn, i /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
c24w
źródło
11

Poszedłem na:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Augustin Riedinger
źródło
-2

wymagaj pliku oryginalnej trasy i zdefiniuj nową trasę w ten sposób

var user = require('./users');
router.post('/login', user.post('/login'));
Roman Mahrer
źródło