express.js – enkele routeringshandler voor meerdere routes in een enkele regel

Is er een manier om dit te doen met een enkele functieaanroep?

var todo = function (req, res){};
app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

Zoiets als:

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

Ik weet dat dit een warboel van de syntaxis is, maar om een ​​idee te geven van wat ik zou willen bereiken, zou een reeks routes geweldig zijn!

Weet iemand hoe je dit moet doen?


Antwoord 1, autoriteit 100%

Ik kwam deze vraag tegen toen ik op zoek was naar dezelfde functionaliteit.

@Jonathan Ong vermeldde in een opmerking hierboven dat het gebruik van arrays voor paden is afgeschaft, maar het wordt expliciet beschreven in Express 4 en het werkt in Express 3.x. Hier is een voorbeeld van iets om te proberen:

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

Van binnen het request-object, met een pad van /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"
}, 

Let op wat er gebeurt met params: het is op de hoogte van de capture-groepen en params in alle mogelijke paden, of ze nu wel of niet in het huidige verzoek worden gebruikt.

Dus het stapelen van meerdere paden via een array kan gemakkelijk worden gedaan, maar de bijwerkingen zijn mogelijk onvoorspelbaar als je hoopt iets nuttigs op te pikken van het pad dat werd gebruikt door middel van params of capture-groepen. Het is waarschijnlijk nuttiger voor redundantie/aliasing, in welk geval het heel goed zal werken.

Bewerken: zie ook het antwoord van @c24w hieronder.

Bewerken 2: Dit is een redelijk populair antwoord. Houd er rekening mee dat ExpressJS, zoals bij de meeste Node.js-bibliotheken, een verplaatsbaar feest is. Hoewel de bovenstaande routering nog steeds werkt (ik gebruik het op dit moment, een erg handige functie), kan ik niet instaan ​​voor de uitvoer van het verzoekobject (het is zeker anders dan wat ik heb beschreven). Test zorgvuldig om er zeker van te zijn dat u de gewenste resultaten krijgt.


Antwoord 2, autoriteit 41%

app.get('/:var(bla|blabla)?', todo)

:varstelt de req.paramin die je niet gebruikt. het wordt in dit geval alleen gebruikt om de regex in te stellen.

(bla|blabla)stelt de regex in om overeen te komen, zodat deze overeenkomt met de tekenreeksen blaen blablah.

?maakt de hele regex optioneel, zodat deze ook overeenkomt met /.


Antwoord 3, autoriteit 36%

Je kunt eigenlijk in een array van padenpasseren, zoals je al zei, en het werkt geweldig:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

Antwoord 4, autoriteit 25%

Om uit te weiden over Kevins antwoord, dit komt uit de 4.x-documenten:

Het pad waarvoor de middleware-functie wordt aangeroepen; kan een van de volgende zijn:

  • Een tekenreeks die een pad vertegenwoordigt.
  • Een padpatroon.
  • Een patroon voor reguliere expressies dat overeenkomt met paden.
  • een reeks combinaties van een van de bovenstaande.

ze hebben een aantal voorbeelden , inclusief:

Dit komt overeen met paden die beginnen met /abcd, /xyza, /lmn, EN /pqr:

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

Antwoord 5, Autoriteit 11%

Ik ging voor een:

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

Other episodes