2015-07-20 74 views
1

我做了一个API,我已经如下路由的:快递JS GET参数

在主要航线文件:

//with sub-route 
    app.use('/api/test/:test', require('./api/test')); 

    //Without sub-route 
    app.use('/api/test2/:test', function(req, res){ 
    console.log('in test', req.params, req.body); 
    return res.status(200).json({params: req.params, body: req.body}); 
    }); 

访问第二个路由将按照预期显示:req.params中的测试。

在模块化路由文件夹( './api/test')我有一子路由器(index.js),它看起来是这样的:

router.get('/:test2', controller.getItem); 

与控制器:

exports.getItem = function getItem(req, res) { 
    console.log('in getItem \nreq.params', req.params, '\nreq.body: ', req.body); 
    return res.status(200).json({yes: 'yes', params: req.params, body: req.body}); 
}; 

所以第一个网址,它没有子路由是:/api/test2 /:测试并注销掉你放置的任何东西:test在req.params中。

第二网址,其子路由:/API /测试/:测试/:TEST2,但是当你把你的GET请求只:TEST2出现在req.params

看来,如果你使用这种模式,路由的“根”(即主路由器)中的任何变量都不会被拾取。

有没有办法解决这个问题?

感谢

回答

2

您将需要一个中间件解决这一问题为您:

function paramFix(req, res, next) { 
    req._params = req.params; 
    next(); 
} 
app.use('/api/test/:test', paramFix, require('./api/test')); 

然后用req._params.test在你的最后一个回调函数。

所以反映安装,你可以扩展你的中间件这样的多层次的:

function paramFix(req, res, next) { 
    req._params = req._params || {}; 
    for (var key in req.params) { 
     if (req.params.hasOwnProperty(key)) { 
      req._params[key] = req.params[key]; 
     } 
    } 
    next(); 
} 
app.use('/api/test/:test', paramFix, require('./api/test')); 
+1

我建议你做'req._params = req._params || []'然后'req._params.push(req.params)'。这种方式适用于多级安装。 – Plato

+0

谢谢。 :)我听说他们将在未来的版本中解决这个问题;我真的希望如此... – user1775718

+0

@Plato:但是你有一个对象数组,你不能再访问'req._params.test'。我更新了我的答案,以反映多个安装级别。 – Amberlamps