【问题标题】:NodeJS/Express app.use sequence and usageNodeJS/Express app.use 顺序和用法
【发布时间】:2014-12-05 13:36:19
【问题描述】:

我尝试将我的节点路由分为两部分: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 的顺序是否重要,和/或我是否必须处理“下一个”?
3. 如果我想访问路由器内部的数据库,我可以交出这样的参数:

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

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    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 调用顺序,index.js 中的router.get('/*', function (req, res) { 行将在您到达其他路线之前捕获所有内容...破坏您的目的。

    另外,如果你不调用next,Express 无法知道你已经完成,甚至你想继续下一个中间件或路由。

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

    这更像是一个范围问题,而不是 Express 问题。我建议查找一些关于 javascript 作用域的优秀文章以及关于 Node handles modules 的优秀文章。

    【讨论】:

    • 感谢马特,这很有帮助。让我深入研究上述来源,我想我会得到它。
    • 剩下的唯一问题:如果顺序很重要,并且我有 app.use(/api/rest/) 包括在 app.use(/) 之前的下一个,那么第二个 app.use 会不会捕获 api /rest 电话?
    • 它可能匹配,是的。有几件事可能仍然会停止执行(res.end 是其中之一,我相信)但如果没有发生,Express 将移动到下一个中​​间件组件并运行它。
    • 谢谢,它有效,我刚试过。阅读文档后,许多事情变得更加清晰。尽管如此:如果中间件函数 (app.use) 是按顺序执行的(在每个 http 请求再次之后?),则必须执行第二个 app.use。但它没有..为什么?即使将 next 放入路由器功能,我得到的是 'REST API' 而不是 'HOME' .. 我喜欢它的工作原理,但这对我来说不合逻辑。
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2013-06-11
    • 2015-01-29
    • 2015-11-22
    相关资源
    最近更新 更多