NodeJS / Express app.use序列和用法

我试图将我的节点路由分成两部分:HTML / App和REST。 这是我所做的:

app.js:

var appPort = process.env.PORT || 80; var express = require('express'); var http = require('http'); var appRouter = require('./routes/index'); var restRouter = require('./routes/rest'); var app = express(); var srv = http.createServer(app); app.set('port', appPort); app.set('view engine', 'jade'); app.use(express.static(path.join(__dirname, 'public'))); app.use('/api/rest/', restRouter); // this seems not working .. I never get the expected response app.use('/', appRouter); // I get this even with localhost/api/rest/... var server = srv.listen(app.get('port'), function() { debug('Express server listening ' + server.address().address + ':' + server.address().port); }); 

index.js:

 var express = require('express'); var router = express.Router(); router.get('/*', function (req, res) { res.send('HOME') }); module.exports = router; 

rest.js

 var express = require('express'); var router = express.Router(); router.get('/api/rest/*', function(req, res) { res.send('REST API'); }); module.exports = router; 

我的问题:
1.一般情况下可以用这种方式build立多个路由器?
2. get.use的顺序是否重要,和/或是否必须处理“next”?
3.如果我想访问路由器内的数据库,我可以交给这样的参数:

 // ... var client = new pg.Client(dbConnection); // ... app.use('/', appRouter(client)); 

感谢所有的帮助!

1)这样可以build立多个路由器。

因为你正在使用这个:

 app.use('/api/rest/', restRouter); 

您在rest.js的路由调用将相对于/api/rest/ ,这意味着您的代码应该在rest.js修改,如下所示:

 router.get('*', function(req, res) { res.send('REST API'); }); 

我也鼓励你在GitHub上看到Express多路由器的例子 。 它通过显示具有版本化路线的REST应用程序非常清楚地说明了这一点。

2)事情的顺序很重要

请参阅app.use的Express文档 ,您将注意到:

中间件function是按顺序执行的,因此中间件包含的顺序非常重要。

如果你逆转你的app.use调用的顺序, app.userouter.get('/*', function (req, res) { line会在你到达其他路由之前捕捉到所有的东西,从而router.get('/*', function (req, res) {你的目的。

而且,如果您不next ,Express无法知道您已经完成,甚至无法继续下一个中间件或路由。

3)数据库问题是一个模块/范围问题

这是一个范围问题,而不是一个快速问题。 我build议查找一些有关javascript范围的优秀文章,以及Node如何处理模块 。