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ć?


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.


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 /.


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

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

11

Poszedłem na:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});

-2

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

var user = require('./users');
router.post('/login', user.post('/login'));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.