express.js - einzelner Routing-Handler für mehrere Routen in einer einzelnen Zeile

106

Gibt es eine Möglichkeit, dies bei einem einzelnen Funktionsaufruf durchzuführen?

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

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

Etwas wie:

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

Ich weiß, dass dies ein Syntax-Durcheinander ist, aber nur um eine Vorstellung davon zu geben, was ich erreichen möchte, wäre eine Reihe von Routen fantastisch!

Weiß jemand, wie man das macht?

Aronis Mariano
quelle
2
Sie sollten in der Lage sein, einen regulären Ausdruck zu schreiben, der mit allen Routen übereinstimmt, die Sie an todo weiterleiten möchten, und den regulären Ausdruck als Endpunkt verwenden. Es mag unordentlich aussehen, aber es wird funktionieren. Ich poste dies nicht als Antwort, da ich nicht sicher bin, wie der reguläre Ausdruck lauten würde, und dies ist eher ein Vorstoß in diese Richtung. Es wird erwähnt, dass reguläre Ausdrücke in den Dokumenten hier verwendet werden: expressjs.com/api.html#app.VERB
Nick Mitchinson
Ich habe keine Erfahrung mit Regex in JS ... ich werde es versuchen ... aber jede andere Option ist willkommen!
Aronis Mariano
1
Ich habe auch nicht viel, weshalb ich es Ihnen ehrlich gesagt nicht nur gegeben habe, aber ich verstehe, dass reguläre Ausdrücke ziemlich universell sind; Express sollte Ihre Ausdrücke so ziemlich wie jede andere Sprache analysieren.
Nick Mitchinson
1
Reguläre Ausdrücke sind sehr mächtig und definitiv lernenswert. Hier ist eine Lösung: app.get (/ ^ \ / ((blabla) {0,2}) $ /, Funktion (req, resp) {var match = req.params [0]; resp .set ('Content- Typ ',' Text / Plain ') .send ("Matched:'" + Matched + "'");}); Ein paar Dinge: 1. Regex beginnt und endet mit einem /, daher müssen alle / Zeichen maskiert werden. 2. Das ^ char entspricht dem Anfang der Zeichenfolge, das $ char entspricht dem Ende der Zeichenfolge. Ohne sie wird das Match auch mit fremden Zeichen am Anfang oder Ende des Pfades erfolgreich sein, dh / x / blablaxxx
John Deighan

Antworten:

129

Ich bin auf diese Frage gestoßen, als ich nach der gleichen Funktionalität gesucht habe.

@ Jonathan Ong erwähnte in einem Kommentar oben, dass die Verwendung von Arrays für Pfade veraltet ist, aber in Express 4 explizit beschrieben wird und in Express 3.x funktioniert. Hier ist ein Beispiel für etwas, das Sie ausprobieren sollten:

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

    }
);

Aus dem Inneren des requestObjekts mit einem Pfad von /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"
}, 

Beachten Sie, was mit Parametern passiert: Es sind die Erfassungsgruppen und Parameter in allen möglichen Pfaden bekannt, unabhängig davon, ob sie in der aktuellen Anforderung verwendet werden oder nicht.

Das Stapeln mehrerer Pfade über ein Array ist also einfach, aber die Nebenwirkungen sind möglicherweise unvorhersehbar, wenn Sie hoffen, etwas Nützliches aus dem Pfad aufzunehmen, der über Parameter oder Erfassungsgruppen verwendet wurde. Es ist wahrscheinlich nützlicher für Redundanz / Aliasing. In diesem Fall funktioniert es sehr gut.

Bearbeiten: Bitte beachten Sie auch die Antwort von @ c24w unten .

Bearbeiten 2: Dies ist eine mäßig beliebte Antwort. Bitte beachten Sie, dass ExpressJS, wie bei den meisten Node.js-Bibliotheken, ein bewegliches Fest ist. Während das obige Routing noch funktioniert (ich verwende es im Moment, eine sehr praktische Funktion), kann ich nicht für die Ausgabe des Anforderungsobjekts bürgen (es unterscheidet sich sicherlich von dem, was ich beschrieben habe). Bitte testen Sie sorgfältig, um sicherzustellen, dass Sie die gewünschten Ergebnisse erhalten.

Kevin Teljeur
quelle
Klappt wunderbar. Vielen Dank.
OrAssayag
58
app.get('/:var(bla|blabla)?', todo)

:var setzt die req.param , was Sie nicht verwenden. Es wird nur in diesem Fall verwendet, um den regulären Ausdruck festzulegen.

(bla|blabla)Setzt den regulären Ausdruck so, dass er mit den Zeichenfolgen blaund übereinstimmt blablah.

?macht den gesamten regulären Ausdruck optional, sodass er auch übereinstimmt /.

Jonathan Ong
quelle
1
/bla(bla)?funktioniert auch, aber alle Parameter danach werden nicht richtig ausgefüllt (dh /bla(bla)?/:valuenicht ausgefüllt req.params.value). Weiß jemand warum?
Josarsson
Wenn Sie Express verwenden, können Sie es mit bekommen, req.params.varaber Sie müssen sicherstellen, dass Sie reqan die Funktion übergeben haben
Matt The Ninja
51

Sie können tatsächlich eine Reihe von Pfaden übergeben , genau wie Sie es erwähnt haben, und es funktioniert hervorragend:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
Alex
quelle
28
Was ist der Ersatz dafür, dass dies veraltet ist?
Brandonscript
5
@ JonathanOng Du sagst, das ist veraltet und Remus fragt, was der Ersatz ist. Könnten Sie bitte seine / ihre Frage beantworten?
nbro
router.route (['/ mailer / out / system', '/ mailer / out /
zahlung
2
@JonathanOng Das Betrachten der aktuellen Express v4-Dokumente mithilfe eines Arrays scheint nicht veraltet zu sein.
Jason Axelson
32

Um auf Kevins Antwort näher einzugehen , stammt dies aus den 4.x-Dokumenten :

Der Pfad, für den die Middleware-Funktion aufgerufen wird. kann eine der folgenden sein:

  • Eine Zeichenfolge, die einen Pfad darstellt.
  • Ein Pfadmuster.
  • Ein Muster für reguläre Ausdrücke, das Pfaden entspricht.
  • Eine Reihe von Kombinationen der oben genannten.

Sie haben einige Beispiele , darunter:

Dies wird passen Pfade beginnend mit /abcd, /xyza, /lmn, und /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
c24w
quelle
11

Ich ging für eine:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Augustin Riedinger
quelle
-2

Benötigen Sie die Datei Ihrer ursprünglichen Route und definieren Sie die neue Route wie folgt

var user = require('./users');
router.post('/login', user.post('/login'));
Roman Mahrer
quelle