2011-10-14 82 views
1

在使用express服務器編寫node.js時,我想首先讓路由中間件在靜態中間件之前運行(希望在靜態內容服務之前完全控制req/res)。node.js和express:可能從路由跳回到中間件(靜態)?

現在,我還在末尾使用了匹配*的路由,簡單地返回了404。顯然,由於我沒有靜態內容的路由,我需要爲我的靜態(公共)文件夾添加路由。這樣做時,我想將路由內部的控制權交給靜態中間件,從而跳過我的404路由。那可能嗎?我讀過我可以調用next(「路由」),但是這給了我與調用next()相同的結果。

感謝

+1

爲什麼不在'static'後添加'*'404? – Raynos

回答

0

我不知道這是否有幫助,但如果你想要的是有選擇地記錄或拒絕靜態文件的下載,你可以這樣做:

至上,保證路由前執行靜態中間件:

app.configure(function(){ 
... 
    app.use(app.router); // this one goes first 
    app.use(express.static(__dirname + '/public')); 
... 

其次,註冊捕獲所有請求並只是有條件地響應的路由。下面的示例檢測並記錄在文件a.txt中(該文件系統路徑是/public/file-A.txt)將下載的消息,任何其他文件的要求將不會中斷下載:

app.get('/*', function(req, res, next){ 
    if(req.params[0] === 'file-A.txt') { // you can also use req.uri === '/file-A.txt' 
     // Yay this is the File A... 
     console.warn("The static file A has been requested") 
     // but we still let it download 
     next() 
    } else { 
     // we don't care about any other file, let it download too 
     next() 
    } 
}); 

這它,我希望這有助於。

3

您不需要明確添加*路由。 Express會爲你做一個404。

您需要做的只是告訴express在靜態中間件之前運行自定義路由。你這樣做是這樣的:

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