NodeJS / Express app.use序列和用法

时间:2014-12-05 13:36:19

标签: javascript node.js express

我尝试将节点路由分为两部分: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.通常可以这种方式构建多个路由器吗? 2. get.use的顺序是否重要,和/或我是否必须处理' next'?
3.如果我想访问路由器内部的数据库,我可以移交这样的参数:

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

1 个答案:

答案 0 :(得分: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的优秀文章。