2016-08-15 1 views
0

Ich habe zwei in hinzugefügt Routen in diesem Reihenfolge:höhere Priorität als die dynamische diejenigen Stellen die spezifischen Routen in Express haben

/:foo 
/login 

Die Art und Weise, wie meine Anwendung strukturiert ist, ist, dass die Routen dynamisch hinzugefügt werden können. Also, ich möchte jede Website Seite (z. B. /hello-world, durch :foo übereinstimmen), aber ich möchte, dass die spezifische Route /login höhere Priorität als die andere haben.

Ich weiß, dass die Middleware in sequenzieller Reihenfolge ausgeführt wird, also muss ich im Idealfall die Reihenfolge der Aufrufe ändern, aber da dies dynamisch geschieht, gibt es einen besseren Weg, es zu tun?

Wie kann ich Express mitteilen, dass die Routen ohne dynamischen Inhalt in ihnen (so ziemlich :) Vorrang vor denen haben sollten, die dynamisch sind?

+0

Wenn Sie den Router so einrichten,/login entspricht /: foo vorher sowieso –

+0

@LukasHechenberger Das ist, was ich in der Frage gesagt habe. ': D' –

Antwort

1

Ich glaube nicht, es ist möglich, mit "plain" Express, aber diese Arbeit kann:

let Router = express.Router; 
let MyRouter = function() { 
    let instance = Router.apply(this, arguments); 
    let handle  = instance.handle.bind(instance); 
    instance.handle = function(req, res, out) { 
    this.stack.sort((layer1, layer2) => { 
     let path1 = layer1.route.path.replace(/:[A-Za-z0-9_]+/g, ':'); 
     let path2 = layer2.route.path.replace(/:[A-Za-z0-9_]+/g, ':'); 

     return path1.length < path2.length; 
    }); 
    return handle(req, res, out); 
    }; 
    return instance; 
} 
express.Router = MyRouter; 

Es besteht im Wesentlichen monkeypatches die handle Methode von express.Router zu sortieren den Layer-Stack (der die Routen enthält) vor der Bearbeitung der Anfrage. Es sortiert Routen basierend auf der Länge des Pfades (längere Pfade haben Priorität), und Hardcodes Parameter in Pfaden haben eine Länge von 1 (also /:foo hat eine Länge von 2 und / hat eine Länge von 1; wenn Sie Pfade wie /x, müssen Sie dies möglicherweise beheben).

Sehr ungeprüft, aber zumindest kann es eine Idee, wie man dies angehen.

+0

Danke! Macht Sinn. Wie ich gelandet bin, habe ich nur überprüft, ob ':' in der URL steht und da ich meine eigene Funktion zum Hinzufügen einer neuen Route anrufe, wenn ':' in der URL ist, füge ich sie einem Router-Objekt hinzu, sonst I fügen Sie es einem anderen Router-Objekt hinzu. Der letzte hat höhere Priorität. :) –

+0

@ IonicăBizău dein klingt wie eine viel sauberere Lösung als mein Hack = D – robertklep

1

Sie sollten eine Route mit der höheren Priorität früher als andere platzieren.

app.get('/login', (req, res) => { 
    res.send('login'); 
}); 
app.get('/:foo', (req, res) => { 
    res.send('fooooo'); 
}); 

Dann wird es funktionieren

Verwandte Themen