2013-04-22 64 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