2017-03-18 68 views
0

我的項目目錄看起來是這樣的:快遞 - 電話再次要求對多條航線

MyProject 
    -app.js 
    -routes 
     -routeone 
     -routetwo 

裏面我app.js文件,它看起來像這樣:

var express = require('express'); 
var app = express(); 

var routeone = require('./routes/routeone'); 
var routetwo = require('./routes/routetwo'); 

app.use('/routeone', routeone); 
app.use('/routetwo', routetwo); 
. 
. 
. 

每個路由文件看起來像這樣:

var express = require('express'); 
var router = express.Router(); 
var bodyParser = require('body-parser'); 
var urlencodedParser = bodyParser.urlencoded({ 
    extended: false 
}); 

router.post('/', urlencodedParser, function(req, res, next) { 
    if (!req.body.param) { 
     //no parameter was provided 
    } else { 
     //there was a parameter provided 
    } 
}); 

module.exports = router;

正如你所看到的,我對bodyparser模塊有依賴性。我需要在每個路由中調用此模塊,併爲此指定選項。將來可能會有更多路由。我想避免在每一個路徑文件中指定這個,因爲說我需要在將來更改extended:true,我將不得不去每個文件並改變它。我寧願在一個地方有這個。我試圖將其添加到app.js文件,但urlencodedParser不能在路徑文件中找到。我也認爲這有一個性能問題,因爲每條路線都需要加載這個模塊。

+0

當您嘗試在app.js中添加正文解析器時,您是如何做到的?你得到了什麼錯誤? – QoP

+0

你可以只在一個地方放置body-parser中間件,而不是放在每個路由器上? – jfriend00

回答

1

一些選擇:

1)將身體解析器中間件app對象在一個地方,而不是對每個人的路線。

2)創建提取公共代碼和它已經爲你創建與路由器中間件路由器一個新的模塊:

var router = express.Router(); 
var bodyParser = require('body-parser'); 
var urlencodedParser = bodyParser.urlencoded({ 
    extended: false 
});  
router.use(urlencodedParser); 
module.exports = router; 

而且,然後使用該新模塊來創建你的每一個路由器。如果/當您需要更改extended: false時,您可以在一個地方更改它。

3)創建一個新的模塊,只是讓你的共同urlencodedParser中間件功能,你可以在每個路由器的使用:

var bodyParser = require('body-parser'); 
var urlencodedParser = bodyParser.urlencoded({ 
    extended: false 
});  
module.exports = urlencodedParser; 

而且,當時要求到每個模塊,並使用進口每個路由器中的解析器。

+0

感謝您的回覆!所有這些似乎都起作用。比其他人更有效嗎? – user2924127

+0

@ user2924127 - 它們都是不同的粒度級別,所以你應該選擇一個適合你需要的。第一個將'urlencodedParser'作爲全球中間件運行於每一條路徑。如果這就是你需要的,那麼這是最簡單的,並保存了大部分代碼。第二種方法是針對給定路由器上的每條路由運行它,從而讓您擁有一些不使用該中間件的整個路由器。第三個選項允許您精確選擇哪個路由器具有此中間件 - 這是最靈活的,但是節省的代碼最少。 – jfriend00

+0

@ user2924127 - 你爲什麼不接受這個答案? – jfriend00

0

只要有變量: var urlencodedParserF = bodyParser.urlencoded({ extended: false }); var urlencodedParserT = bodyParser.urlencoded({ extended: true });