2015-12-15 55 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