2013-04-18 56 views
7

靜態文件和app.get衝突我有這樣一段代碼在這裏:即成使用Express.js

var express = require('express') 
    , http = require('http') 

var app = express(); 
var server = app.listen(1344); 
var io = require('socket.io').listen(server); 


app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 


app.get('/', function(req, res){ 
    if(req.session){ 
     console.log(req.session); 
    } 
    console.log('ok'); 

}); 

app.get()回調中的代碼不會被調用。如果我註釋掉app.use(express.static(__dirname + '/public'))一行,那麼callaback就起作用了。我嘗試改變順序,但它像彩票!我寧願知道這裏出了什麼問題。

我相信這與我的知識缺乏有關如何調用中間件有關。有人能幫我理解這個問題嗎?

基本上我只想執行一些邏輯,然後才能提供文件並在瀏覽器上加載index.html。順便把app.get()放在app.use(express.static())之前,並沒有訣竅!

+1

你有一個public/index.html文件嗎? –

+0

是的,我有..... – limoragni

+2

這就是爲什麼它壞了。刪除它,一切都會工作。可能有像「dir」這樣的選項來禁用索引文件夾,但我不確定 –

回答

5

你的靜態文件中間件應該先走。

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 

而且您應該爲app.router添加一個用途。

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({secret: 'secret'})); 
app.use(app.router); 

爲每個請求處理中間件。因此,如果您的靜態文件中有index.html,那麼對yourdomain.com/的請求將永遠不會對app.router執行請求,因爲它們將由靜態文件處理程序提供服務。刪除index.html,然後該請求將流向您的app.router

+0

感謝您的回覆。但是,如果使用app.router按照該順序使用mddleware,則不會提供這些文件。 app.get()內的代碼被觸發。我想在app.get()中執行文件服務和代碼。 – limoragni

+0

靜態中間件應該永遠是第一個,因爲你不需要它上面的所有中間件。例如,解析cookies,設置會話或靜態資產的用戶身份驗證非常愚蠢。 –

+0

好的...我明白了。我沒有正確使用靜態文件。我開始意識到這一點。我thinkink刪除index.html文件,並從服務器端渲染該文件。這是正確的方式嗎? – limoragni

3

將您的index.html文件重命名爲其他內容。這是一個簡單的

app.use(express.static(__dirname + '/public')); 

app.get('/', function(req, res){ 
    if(req.session){ 
     console.log(req.session); 
    } 
    console.log('ok'); 
    res.sendfile(new_index_file); 
}); 
0

我相信,你有3個選擇這裏:

1)安裝你的app.get('/')路線(可能的話,使用app.router)之前靜態的中間件,讓他們優先。首先安裝的中間件首先處理匹配的請求。

2)使用路徑前綴爲您喜歡app.use('/static', express.static('public'));靜態路徑,使靜從example.com/static/...

3服)想表演聰明搬起石頭砸自己的腿? :)有時,人們使用Accept標題和內容協商來在不同情況下從同一網址提供2種不同的內容類型。只有在請求的Accept標題需要正確的類型時,纔可以讓您的靜態中間件檢查Accept標頭和處理請求中的特定內容類型。否則,它會將流向下傳遞給您/視圖。您可以在req.accepts中自定義您的靜態中間件內容協商。