2013-02-16 9 views
6

Ich versuche Express zu verwenden, um die Querystring zu parsen, falls bestimmte Parameter gesetzt sind und ein kleines Stück Code auszuführen, bevor das eigentliche Routing stattfindet. Der Anwendungsfall besteht darin, einen bestimmten Wert zu wählen, der unabhängig von der verwendeten Verbindung eingestellt werden kann. Ich benutze die Express-Funktionalität, um die Dinge mit next() an die nächste mögliche Regel weiterzuleiten.Vorrouting mit Querystrings mit Express in Knoten JS

Bisher habe ich versucht - an der Spitze aller app.get/Nach-Regel-Block:

app.get('[?&]something=([^&#]*)', function(req, res, next) { 
    var somethingID = req.params.something; 
    // Below line is just there to illustrate that it's working. Actual code will do something real, of course. 
    console.log("Something: "+somethingID); 
    next(); 
}) 

app.get('/', site.index); 

und auch:

app.param('something', function(req, res, next) { 
    var somethingID = req.params.something; 
    console.log("Something: "+somethingID); 
    next(); 
}) 

app.get('/', site.index); 

Beispiel von dem, was ausgelöst werden soll :

URL: www.example.com/?something=10239 
URL: www.example.com/superpage/?something=10239 
URL: www.example.com/minisite/?anything=10&something=10239 

Leider keine meiner Lösungen gearbeitet tatsächlich, und alles, was passiert ist, dass die nächste passende Regel ausgelöst wird, aber die kleine Funktion oben wird nie ausgeführt. Hat jemand eine Idee, wie das geht?

EDIT: Ich verstehe, dass das Param-Beispiel nicht funktionierte, da ich den Parameter in keiner anderen Routing-Regel danach benutze, und es würde nur dann ausgelöst werden.

Ich verstehe auch, dass die Logik impliziert, dass Express ignoriert die Querystring und es ist normalerweise innerhalb einer Funktion nach dem Routing bereits passiert geparst. Aber wie gesagt, ich brauche das "routenunabhängig" und arbeite mit allen URLs, die in dieser Anwendung verarbeitet werden.

Antwort

21

express darf nicht zu Ihnen Route basierend auf Abfrage-Strings. Sie könnten eine Middleware hinzufügen, die einige Operationen ausführt, wenn der relevante Parameter vorhanden ist.

app.use(function (req, res, next) { 
    if (req.query.something) { 
     // Do something; call next() when done. 
    } else { 
     next(); 
    } 
}); 

app.get('/someroute', function (req, res, next) { 
    // Assume your query params have been processed 
}); 
+3

Das ist eleganter und gültiger als meine eigene Lösung. Danke vielmals. – lucorlis

1

Ok, hier ist ein logischer Fehler. Routing verwendet nur die URL und ignoriert die Querystring.

Der (oder besser „A“) Lösung ist eigentlich diese:

app.get('*', function(req, res, next) { 
    if (req.query.something) { 
    console.log("Something: "+req.query.something); 
    }; 
    next(); 
}) 

Erläuterung: As Express die Abfragezeichenfolgeflag für das Routing ignoriert, die nur für reguläre Ausdrücke alle URLs ist „*“ entspricht. Sobald das ausgelöst ist, kann ich prüfen, ob der Querystring vorhanden ist, meine Logik ausführen und das Routing mit der nächsten Regel fortsetzen, indem ich "next()" verwende.

Und ja: facepalm