路由正在覆盖中间件

时间:2013-04-22 21:12:54

标签: node.js express

我的路由正在覆盖我的静态文件中间件调用,即使我按正确的顺序运行它:

首先我设置我的静态文件,如下所示:

app.use('/public/', express.static('/home/skerit/temp'));
app.use('/public/', express.static('/home/skerit/app/public'));

然后我添加我的路线:

app.get('/:controller/:action', callback);

现在,当我尝试获取/public/empty.txt时,执行路由。 当我删除路线时,它可以正常工作。

我确信它们按照正确的顺序发生。 (首先是app.use,然后是app.get)

那么这里可能出现什么问题?

编辑:因为我说我正在以正确的顺序执行它们,所以这里有一些证据。 我在代码的执行中添加了简单的日志语句:

[debug]   - [stages.js:186] Static middleware has been set!
[debug]   - [stages.js:191] Startin routes!
[debug]   - [routes.js:7] Setting controller routes
[info]    - [database.js:79] Database connection to default has been made
[info]    - [database.js:93] Stored procedures on MongoDB server default
[info]    - [database.js:120] Created connection to all datasources
[debug]   - [stages.js:202] Setting /:controller/:action

正如您所看到的:'静态中间件已经设置'首先出现。只有这样才开始设置其他路线。

1 个答案:

答案 0 :(得分:0)

app.get不是决定路由是在中间件之前还是之后运行的,而app.use(app.router)就是这样做的。 你需要{app}使用app.use(app.router)(express.static);

这里有两个例子:

var http = require('http');
var express = require('express');
app = express();
app.use(app.router);
app.use('/public/', express.static('/home/skerit/temp'));
app.get('/:controller/:action', function (req, res) {
    res.send(req.params.controller);
});
var server = http.createServer(app);
server.listen(process.env.port || 3000);

此代码段不起作用,当您运行localhost:3000 / public / somefile时 - 您将返回“public”。 但是,如果您使用以下代码段:

var http = require('http');
var express = require('express');
app = express();
app.use('/public/', express.static('/home/skerit/temp'));
app.get('/:controller/:action', function (req, res) {
    res.send(req.params.controller);
});
app.use(app.router);
var server = http.createServer(app);
server.listen(process.env.port || 3000);

localhost:3000 / public / somefile应该返回文件的内容。请注意app.use(app.router)的位置。 (如果你不添加它,默认情况下应该是最后一次)。

另请注意,如果/ home / skerit / temp / somefile不存在,则控件将传递给下一个中间件,它看起来像express.static不起作用,因此请确保您的路径正确。

编辑:
在发表评论之后,我被告知我的原始答案是不正确的,也就是说app.get确定中间件堆栈app.router放在什么位置。即使是第一次使用app.router或app使用.get 在这种情况下,我怀疑你的问题很可能是因为你正在使用一个不存在的文件的URL。