2016-10-03 70 views
0

我想根据请求中的查询参数将传入请求重定向到不同的端点。Reroute url | Nodejs | Express

例如,

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

category值可以是[ABC,IJK,PQR,XYZ]中的一个。

基于category值,请求应该重定向到 “/ ABC”, “/ IJK”, “/ PQR”, “/ XYZ” 保留其余的参数之一。

因此,上述要求应该成为/xyz/?param1=...&param2=...

我是新来的NodeJS /快递,我认为这是更好地创建基于category值模块化的代码不同的路线。

什么是处理这种情况的理想方法?

回答

0

为这些值中的每一个创建一条路径[abc, ijk, pqr, xyz]。为了处理不同的查询参数(?category=xyz)创建变换请求的URL中间件:

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(); 
}); 

假设这是一个GET请求类别的路线将是:

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'); 
}); 

注意,中间件将修改网址的所有请求,通过请求url进行过滤,添加路径app.use("/path", function(req,res,next)...或在其中添加一些逻辑。

+0

但我不能改变传入的请求url的模式。它将始终采用我在我的问题中指定的格式。 – user1010

+0

好的,我明白了。我将用可能的解决方案编辑我的答案。 –

0

看起来像老“头版控制器”的格局:

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') 
} 

,或者使用“头版术语”

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') 
} 

或者,你可以得到和修改或创建一个自定义路由调度器在中间件...