2016-06-24 16 views
1
app.get('/api/advancedSearch/:id/:page_no/:exact_phrase?/:exclude_words?' 
,function (req,res) 
{ //body }); 

Ich versuche, eine app.get zu erstellen, wie oben gezeigt, ich habe also keine Probleme mit den ersten paar Felder, stellt sich das Problem mit dem „exact_phrase“ und „ausschließen "Felder. Diese sollen Listen sein und wenn beide bestanden sind, habe ich keine Probleme sie zu bekommen.ausdrücken app.get mit mehreren Feldern

Was Probleme verursacht ist, dass manchmal eines oder beide dieser Felder nicht vorhanden sind und ich es trotzdem bekommen muss. Ich kann nicht in der Lage sein, das app.get dafür zu entwerfen.

Gibt es eine Möglichkeit, das app.get zu entwerfen oder die Anfrage so zu senden, dass ich das tun kann?

+3

Es scheint, als wären Sie besser dran mit ['req.query'] (http://expressjs.com/en/4x/api.html#req.query) statt' req.params' – cdbajorin

Antwort

3

Im Allgemeinen funktionieren optionale Teile der URL viel besser in der Abfragezeichenfolge, da sie sich selbst identifizieren, welche vorhanden sind (da sie benannte Parameter sind und nicht nur durch die URL-Position identifiziert werden).

URL-Pfadsegmente im Express-Routenkombination sind auftragsspezifisch, und Sie können keine beliebige Sequenz von optionalen Parametern haben, da dies für das, was übergeben wurde, nicht deterministisch ist. Der Express-Route-Matching-Algorithmus an sich ist nicht so flexibel oder leistungsfähig, wie Sie zu haben scheinen.

Sie haben mehrere Möglichkeiten:

  1. die :exact_phrase und :exclude_words aus der Routendefinition verlassen und dann Handler nur tun, um Ihre eigene URL-Analyse in der Route genau zu sehen, was da ist. Auf diese Weise können Sie sich an jedes gewünschte Format anpassen.

  2. Setzen Sie alle Parameter, die möglicherweise in einer anderen Reihenfolge oder optional als Query-Parameter sind, anstatt Pfadsegmente in der URL und verwenden Sie dann req.query, um genau zu sehen, was in der URL vorhanden war. Abfrageparameter sind optional und können in beliebiger Reihenfolge angegeben werden.

Diese letzte Option würde so aussehen:

// url: /api/advancedSearch/123/4?exact_phrase=foo&exclude_words=cat,dog 
app.get('/api/advancedSearch/:id/:page_no/', function(req,res) { 
    var excludeWords = []; 
    if (req.query.exclude_words) { 
     excludeWords = req.query.exclude_words.split(","); 
    } 
    var exactPhrase = req.query.exact_phrase || ""; 

    // do the rest of your processing here 

}); 

FYI, es macht Sinn, dass konzeptionell optionale Argumente in dem querystring sein sollten, nicht im Kern URL-Pfad. Da Abfrage-String-Parameter sich selbst identifizieren, macht es viel weniger zweideutig, welche vorhanden sind und welche nicht. Wenn Sie optionale Pfadsegmente in der URL haben, müssen Sie irgendwie ein System erfinden, um zu identifizieren, welches Pfadsegment vorhanden ist und welche Bedeutung es hat. Da dies völlig anwendungs- und kontextspezifisch ist, kann Express das nicht automatisch für Sie erledigen.

+0

Genau Was ich gesucht habe danke! –

Verwandte Themen