2013-04-22 70 views
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)

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

编辑:由于我说我正在执行他们在正确的顺序,这里有一些证据。 我添加简单的日志语句代码的执行:

 
[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 

正如你可以看到:“静态中间件已设置的第一次出现。只有这样它才开始设置其他路线。

+0

[node.js/express.js可能的重复 - 如何app.router工作?](http://stackoverflow.com/questions/12695591/node-js-express-js-how-does-app-路由器工作) – josh3736 2013-04-22 21:15:01

+0

...你可能在你的'app.use(... static)'之前定义了其他路由'我很确定我不是' – josh3736 2013-04-22 21:17:36

+0

'。 – skerit 2013-04-22 21:28:09

回答

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

这个片段不工作,当您运行本地主机:3000 /公/ somefile - 你会得到 “公共” 返回。 但是如果你使用下面的代码片段:

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

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

还要注意的是,如果/家庭/ skerit /温度/ somefile不存在,那么控制将传递到下一个中​​间件,它看起来像express.static没有工作,所以一定要确保你的路是正确的。

编辑:
继我被告知,我原来的答复是不正确的,也就是说,app.get并在中间件堆栈app.router什么时候决定一个评论是put.Namely在第一时间使用app.router或使用app.get。
在这种情况下,我会怀疑你的问题很可能是由于你正在使用一个url到一个不存在的文件。

+2

'app.get' *确定路由是在中间件之前还是之后运行;一旦你使用'app.get'(或'.post',...),路由器中间件被插入中间件堆栈([here](https://github.com/visionmedia/express/blob/master/ LIB/application.js中#L410))。在其他中间件之前添加路由相当于在其他中间件之前添加'app.router'。 – robertklep 2013-04-23 06:35:20

+0

谢谢,我没有意识到这一点,我会相应地更改评论。 – 2013-04-23 07:34:09