1

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

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

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)

那么这里有什么问题呢?

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

[调试] - [stages.js:186] 静态中间件已设置!
[调试] - [stages.js:191] 开始路线!
[debug] - [routes.js:7] 设置控制器路由
[info] - [database.js:79] 已建立默认数据库连接
[info] - [database.js:93] MongoDB 服务器默认存储过程
[info] - [database.js:120] 创建到所有数据源的连接
[调试] - [stages.js:202] 设置 /:controller/:action

如您所见:“已设置静态中间件”首先出现。只有这样它才开始设置其他路线。

4

1 回答 1

0

app.get不是决定路由是在中间件之前还是之后运行的决定因素,而是app.use(app.router)这样做的。你需要app.use(app.router)在 app.use(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 指向一个不存在的文件。

于 2013-04-23T06:15:40.823 回答