2015-07-20 75 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