2016-10-03 9 views
0

Ich möchte eingehende Anfrage an verschiedene Endpunkte basierend auf einem Abfrageparameter in der Anfrage umleiten.Reroute URL | Nodejs | Express

Zum Beispiel

http://localhost:9000/?category=xyz&param1=...&param2=...

category Wert kann man von [abc, ijk, pqr, xyz] sein.

Basierend auf category Wert, Anfrage zu einem von "/ abc" get umgeleitet "/ ijk", "/ PQR", "/ xyz" übrigen Parameter zu erhalten.

So sollte die obige Anfrage /xyz/?param1=...&param2=...

werde ich bin neu in NodeJS/auszudrücken, dachte ich, es besser ist, verschiedene Routen auf category Wert basiert zu erstellen, den Code modularisieren.

Was ist der ideale Ansatz, um solche Fälle zu behandeln?

Antwort

0

Erstellen Sie eine Route für jeden dieser Werte [abc, ijk, pqr, xyz]. Für verschiedene Abfrageparameter Handling (?category=xyz) schaffen eine Middleware, die die Anforderungs-URL-Transformation:

app.use(function(req, res, next) { 
    // adding category in the url path will redirect to the 
    // correct route after calling next function 
    req.url = "/" + req.query.category; 
    next(); 
}); 

es ist eine GET Anfrage Unter der Annahme, die Kategorien Routen wäre:

app.get('/abc', function(req, res) { 
    //do stuff for 'abc' category 
    res.send('abc'); 
}); 

app.get('/ijk', function(req, res) { 
    //do stuff for 'ijk' category 
    res.send('ijk'); 
}); 

app.get('/pqr', function(req, res) { 
    //do stuff for 'pqr' category 
    res.send('pqr'); 
}); 

app.get('/xyz', function(req, res) { 
    //do stuff for 'xyz' category 
    res.send('xyz'); 
}); 

Beachten Sie, dass Middleware-URL für alle bearbeiten wird Anfragen, filtern Sie durch die Anfrage URL, die den Weg app.use("/path", function(req,res,next)... hinzufügt, oder fügen Sie etwas Logik darin hinzu.

+0

Aber ich kann das Muster der eingehenden Anfrage URL nicht ändern. Es wird immer in dem Format sein, das ich in meiner Frage angegeben habe. – user1010

+0

OK, ich verstehe. Ich werde meine Antwort mit einer möglichen Lösung bearbeiten. –

0

Sieht aus wie das alte „Titelseite Controller“ Muster:

app.get('/', routeByParameter) 
function routeByParameter(req, res){ 
    var category = req.params.category 
    if(category === 'abc'){ 
    return abcRoute(req, res) 
    } 
    else if(category === 'xyz'){ 
    return xyzRoute(req, res) 
    } 
} 
function abcRoute(req, res){ 
    req.send('abc') 
} 

oder die „Terminologie Titelseite“ verwenden

app.get('/', dispatcher) 
function dispatcher(req, res){ 
    var category = req.params.category 
    if(category === 'abc'){ 
    return viewAbc(req, res) 
    } 
    else if(category === 'xyz'){ 
    return viewXyz(req, res) 
    } 
} 
function viewAbc(req, res){ 
    req.send('abc') 
} 

Alternativ könnten Sie in erhalten und modifizieren oder einen eigenen erstellen Route Dispatcher in der Middleware ...