2014-09-24 94 views
2

我想在Node Express中設置可擴展的路由。可伸縮節點快速路由

我明白如何設置工作路線......這是我努力的失敗/不匹配。更具體地說,我正在努力處理404錯誤。

這是我有...

app.get('/:folder',function(req,res) { 
    var path = 'site/' + req.params.folder + '/index.jade'; 
    res.render(path); 
}); 

app.get('/:folder/:topic',function(req,res) { 
    var path = 'site/' + req.params.folder + '/' + req.params.topic; 
    res.render(path); 
}); 

app.use(function(req, res, next){ 
    res.status(404).render('site/404.jade'); 
}); 

面臨的挑戰是,:文件夾:主題將匹配任何使404將永遠不會觸發。我不想硬編碼我們所有的文件夾和主題名稱。那麼,我應該如何設置我的路由,以便在文件夾/主題不存在的情況下,這些請求會落到404上?

謝謝。

UPDATE

最後,工作溶液如下。感謝大家。

var fs = require('fs'); 

app.get('/:folder',function(req,res,next) { 
    var path = __dirname + '/views/site/' + req.params.folder + '/index.jade'; 

    if(fs.existsSync(path)) 
    { 
     res.render(path); 
    } 
    else 
    { 
     next(); 
    } 
}); 

app.get('/:folder/:topic',function(req,res,next) { 
    var path = __dirname + '/views/site/' + req.params.folder + '/' + req.params.topic + '.jade'; 

    if(fs.existsSync(path)) 
    { 
     res.render(path); 
    } 
    else 
    { 
     next(); 
    } 
}); 

app.use(function(req, res){ 
    res.status(404).render('site/404.jade'); 
}); 
+0

感謝大家的建議。 – 2014-09-24 20:21:55

回答

5

有傳遞給app.get第三(可選)參數:nextnext實際上是一個回調函數,您可以調用該函數使您的路線進入下一個路徑。

所以,你可以做這樣的事情:

app.get('/:folder',function(req, res, next) { 
    var path = 'site/' + req.params.folder + '/index.jade'; 
    var pathIsValid = ... // use something like fs.exists to check if the path is valid 
    if (pathIsValid) { 
     res.render(path); 
    } else { 
     next() 
    } 
}); 

如果下一個被調用時,它會嘗試下一個路徑。如果這個(和其他任何人)接下來調用,那麼你會到達你的404處理程序。

2

在您的文件夾和主題路線中,您需要使用fs.exists來查看視圖路徑是否存在,如果不存在,只需調用next()而不顯示任何內容。然後,路由將轉到404處理程序。

1

嘗試

app.get('/:folder/:topic',function(req,res) { 
    var path = 'site/' + req.params.folder + '/' + req.params.topic; 
    if(fileExists(path)) { 
     res.render(path); 
    } else { 
     res.status(404).render('site/404.jade');   
    } 
}); 

app.get('/:folder',function(req,res) { 
    var path = 'site/' + req.params.folder + '/index.jade'; 
    if(fileExists(path)) { 
     res.render(path); 
    } else { 
     res.status(404).render('site/404.jade');   
    } 
}); 


app.all('*', function(req, res){ 
    res.status(404).render('site/404.jade'); 
}); 

如果我們有像URL /folder/topic,它滿足路線1,並且請求被處理。 如果我們有/folder URL,它無法滿足航線1,但滿足航線2. 如果我們有一些不同的東西,比我們渲染路徑3

fileExists一些功能驗證,該模板存在,http://nodejs.org/api/fs.html#fs_fs_existssync_path例如