NodeJS/Express app.use sequence and usage

NodeJS/Express app.use sequence and usage

本文关键字:sequence and usage use app Express NodeJS      更新时间:2023-09-26

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

应用.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);
});

索引.js:

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

休息.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 的顺序是否重要,和/或我必须处理"下一步"?
3. 如果我想访问路由器内的数据库,我可以交出这样的参数吗:

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

1(可以通过这种方式构建多个路由器。

因为你正在使用这个:

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 文档,您将注意到:

中间件函数是按顺序执行的,因此顺序为 包含中间件很重要。

如果您颠倒app.use呼叫的顺序,index.js 中的router.get('/*', function (req, res) {线路将在您到达其他路线之前捕获所有内容......挫败你的目的。

另外,如果你不打电话next,Express没有办法知道你已经完成了,甚至你想继续下一个中间件或路由。

3(数据库问题是模块/范围问题

这更像是一个范围问题,而不是一个明确的问题。 我建议查找一些关于javascript范围的优秀文章,以及Node如何处理模块。