express.js - unico gestore di routing per più percorsi in una singola riga


109

C'è un modo per farlo su una singola chiamata di funzione?

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

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

Qualcosa di simile a:

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

So che questo è un pasticcio di sintassi, ma solo per dare un'idea di ciò che vorrei ottenere, una serie di vie sarebbe fantastico!

Qualcuno sa come farlo?


2
Dovresti essere in grado di scrivere un'espressione regolare che corrisponda a tutte le rotte a cui vuoi indirizzare le cose da fare e utilizzare l'espressione regolare come endpoint. Potrebbe sembrare disordinato, ma funzionerà. Non lo sto postando come una risposta perché non sono sicuro di quale sarebbe l'espressione regolare, e questa è più una spinta in quella direzione. Si parla dell'utilizzo di espressioni regolari nei documenti qui: expressjs.com/api.html#app.VERB
Nick Mitchinson

non ho esperienza con regex in JS ... ci proverò ... ma qualsiasi altra opzione è la benvenuta!
Aronis Mariano

1
Nemmeno io ho molto, il che è onestamente il motivo per cui non te l'ho dato solo a te, tuttavia la mia comprensione è che le espressioni regolari sono abbastanza universali; Express dovrebbe analizzare le tue espressioni più o meno come qualsiasi altra lingua.
Nick Mitchinson

1
Le espressioni regolari sono molto potenti e meritano sicuramente di essere imparate. Ecco una soluzione: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- digita ',' text / plain ') .send ("Matched:'" + matched + "'");}); Un paio di cose: 1. le espressioni regolari iniziano e finiscono con /, quindi ogni carattere / deve essere evitato. 2. Il carattere ^ corrisponde all'inizio della stringa, il carattere $ corrisponde alla fine della stringa. Senza di loro, la partita avrà successo anche con caratteri estranei all'inizio o alla fine del percorso, ad esempio / x / blablaxxx
John Deighan

Risposte:


132

Mi sono imbattuto in questa domanda mentre cercavo la stessa funzionalità.

@Jonathan Ong ha menzionato in un commento sopra che l'uso di array per i percorsi è deprecato ma è esplicitamente descritto in Express 4 e funziona in Express 3.x. Ecco un esempio di qualcosa da provare:

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

    }
);

Dall'interno requestdell'oggetto, con un percorso di /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"
}, 

Nota cosa succede con params: è a conoscenza dei gruppi di cattura e dei parametri in tutti i percorsi possibili, indipendentemente dal fatto che siano usati o meno nella richiesta corrente.

Quindi impilare più percorsi tramite un array può essere fatto facilmente, ma gli effetti collaterali sono forse imprevedibili se si spera di raccogliere qualcosa di utile dal percorso che è stato utilizzato tramite parametri o gruppi di acquisizione. Probabilmente è più utile per ridondanza / aliasing, nel qual caso funzionerà molto bene.

Modifica: vedi anche la risposta di @ c24w di seguito .

Modifica 2: questa è una risposta moderatamente popolare. Tieni presente che ExpressJS, come la maggior parte delle librerie Node.js, è una festa mobile. Sebbene il routing sopra funzioni ancora (lo sto usando al momento, una funzionalità molto utile), non posso garantire l'output dell'oggetto richiesta (è certamente diverso da quello che ho descritto). Si prega di testare attentamente per assicurarsi di ottenere i risultati desiderati.


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

:varimposta quello req.paramche non usi. è usato solo in questo caso per impostare la regex.

(bla|blabla)imposta la regex in modo che corrisponda, quindi corrisponde alle stringhe blae blablah.

?rende facoltativa l'intera regex, quindi corrisponde /anche a.


1
/bla(bla)?funziona anche, ma tutti i parametri dopo non vengono inseriti correttamente (ovvero /bla(bla)?/:valuenon vengono inseriti req.params.value). Qualcuno sa perché?
joscarsson

Se stai usando express puoi ottenerlo req.params.varma devi assicurarti di essere reqpassato alla funzione
Matt The Ninja

51

Puoi effettivamente passare in una serie di percorsi , proprio come hai detto, e funziona alla grande:

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

28
Qual è la sostituzione per questo essere deprecato?
brandonscript

5
@JonathanOng Dici che è deprecato e remus chiede qual è la sostituzione. Potresti rispondere alla sua domanda?
nbro

router.route (['/ mailer / out / system', '/ mailer / out / payment']) funziona perfettamente in express 4 nessun avviso di deprecazione
danday74

2
@JonathanOng che esamina i documenti correnti di Express v4 utilizzando un array non sembra essere deprecato.
Jason Axelson

32

Solo per approfondire la risposta di Kevin , questa è dai documenti 4.x :

Il percorso per il quale viene richiamata la funzione middleware; può essere uno qualsiasi di:

  • Una stringa che rappresenta un percorso.
  • Un modello di percorso.
  • Un modello di espressione regolare per abbinare i percorsi.
  • Una serie di combinazioni di uno qualsiasi dei precedenti.

Hanno alcuni esempi , tra cui:

Ciò corrisponderà percorsi a partire da /abcd, /xyza, /lmne /pqr:

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

11

Ho scelto:

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

-2

richiedere il file del percorso originale e definire il nuovo percorso in questo modo

var user = require('./users');
router.post('/login', user.post('/login'));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.