2014-12-05 27 views
2

我尝试将节点路由分为两部分:HTML/App和REST。这里是我做了什么:NodeJS/Express app.use序列和用法

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通常可以用这种方式构建多个路由器?
2. get.use的顺序是否重要,和/或是否必须处理'next'?
3.在情况下,我想访问路由器内部的数据库,我可以交出一个参数是这样的:

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

感谢所有帮助!

回答

4

1)可以用这种方式构建多个路由器。

因为你使用这样的:

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

您的呼叫路由在rest.js将相对于/api/rest/这意味着你的代码应该在rest.js进行修改,看起来像这样:

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

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

2)事物的秩序关系

Express documentation for app.use,你会注意到:

中间件功能的顺序执行,因此 中间件包含的顺序很重要。

如果颠倒您app.use调用的顺序,router.get('/*', function (req, res) {线index.js你会得到其他路线之前...打败你的目的捕获一切。

此外,如果您没有拨打next,Express无法知道您已完成,甚至无法继续执行下一个中间件或路由。

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

这是多于一个Express问题一个范围问题。我建议查找一些关于JavaScript范围的优秀文章,以及如何Node handles modules

+0

谢谢Matt,这对我有很大的帮助。让我深入讨论提到的来源,我想我会得到它。 – Rainer 2014-12-05 14:58:10

+0

剩下的唯一问题是:如果序列很重要,并且在app.use(/)之前包含app.use(/ api/rest /),那么第二个app.use会不会捕获api/rest调用? – Rainer 2014-12-05 14:58:33

+0

它可能会匹配,是的。有几件事情可能仍然会停止执行(我认为'res.end'是一个,但是如果没有发生,Express将移动到下一个中​​间件组件并运行它。 – 2014-12-05 15:12:31

相关问题