2015-12-15 51 views
0

不同的模塊,我有一個應用程序,我想在快遞安裝使用app.use,如:快遞JS需要根據路線

app.use(require('./foo')); 

當這樣定義這將返回在同級應用程序文件foo.js

var router = require('express').Router({ mergeParams: true }); 
module.exports = router; 
router.get('/', function (req, res) { 
    res.send(200); 
} 

// Navigate to /foo -> 200 ok! 

然而,我想引用基於請求路徑上的其他應用程序,以便代替

app.use(require('./foo')); 

我們可以做

app.use(function (req, res) { 
    require(req.path); 
}; 

所以如果有一些文件bar.js,我們可以想見,

// Navigate to /bar 
returns bar app. 

但是,這並不工作,而是超時,因爲我相信它沒有安裝所需的應用程如何將回調傳遞給app.use,以便裝載回調函數定義中定義的所需應用程序?

感謝您的任何幫助。

回答

1

幾件事情需要考慮:

1)您將需要調用路由器本身(這就像任何中間件(req, res)功能),並通過它你的要求。

app.use(function (req, res) { 
    var router = require('.' + req.path); // or whatever your lookup method looks like 
    router(req, res); 
}); 

2)由於上述未安裝任何路徑上的主中間件,req.path將保持不變(例如'/foo'),永遠不會匹配兒童路由器的.get('/')路由。您可以通過讓子路由器.use()的中間件解決此問題,這與您已經在應用程序端點中一樣好。 (請注意,如果您的中間件足夠簡單,您也可以僅導出中間件本身而不是整個路由器)

// foo.js 
router.use(function (req, res) { 
    res.send(200); 
}); 
+0

完美。正是我在找什麼。 –

0

查看Express req.path的文檔。

http://expressjs.com/en/api.html

看起來req.path將返回類似/foo,但你需要它./foo爲它找到該文件,並要求它。試着改變你的要求是

require('.' + req.path); 
+0

感謝您的回答。我實際上使用'''require('app-module-path')'''所以我不認爲這是問題,但是謝謝。 –

+0

你可以在這裏發佈你的確切代碼嗎? – Mike