【问题标题】:Routes are overwriting middleware路由正在覆盖中间件
【发布时间】:2013-04-22 21:12:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • ...您可能在 app.use(...static) 之前定义了其他路线
  • 我 100% 确定我不是。
  • 您是否将app.use(app.router); 放在静态中间件之前的任何位置?查看更多(如果不是全部)您的 app.js 可能对我们有所帮助
  • express/lib/application.js:406 上放一个断点,看看路由器是否在你预期之前被隐式添加。

标签: node.js express


【解决方案1】:

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);

这个 sn-p 不起作用,当你运行 localhost:3000/public/somefile - 你会得到“public”返回。 但是,如果您使用以下 sn-p:

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 指向一个不存在的文件。

【讨论】:

  • app.get 确实决定路由是在中间件之前还是之后运行;一旦你使用app.get(或.post,...),路由器中间件就会被插入中间件堆栈(here)。在其他中间件之前添加路由相当于在其他中间件之前添加app.router
  • 谢谢,我不知道,我会相应地更改评论。
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 2023-03-26
  • 2017-05-24
  • 2014-05-28
  • 1970-01-01
  • 2016-07-12
  • 2018-04-22
  • 1970-01-01
相关资源
最近更新 更多