2012-01-06 30 views
11

我想在express.js上過濾之前像rails一樣執行過濾器。 我有一個名爲photo.js的文件,我將所有與照片相關的路線放在那裏。但我需要將未在我的系統上進行身份驗證的用戶重定向到登錄頁面。我想做一個beforeFilter所以後來我不需要把這種邏輯在我所有的路線......express.js上的過濾器

感謝

回答

14

如果你想保留你的photo.js文件中的所有內容,我認爲更好的方法是使用app.all並傳遞內置到應用程序路由中的多個回調函數(其工作方式類似於路由中的中間件)。例如

app.all('/photo/*', requireAuthentication, loadUser); 

app.get('/photo/view', function(req, res) { 
    res.render('photo_view'); 
}); 

app.get('/photo/list', function(req, res) { 
    res.render('photo_list'); 
}); 

requireAuthenticationloadUser的功能。

看看http://expressjs.com/api.html#app.all

+0

使用'all'是一種很好的方法。我在'express-'resource之上爲我的路由使用它,並且它非常適合身份驗證和授權。 – JohnnyCoder 2013-11-20 02:21:48

3

有擴展或更高級別的框架,如express-resource

+0

爲app.VERB文檔和app.all如何表達資源的責任/過濾器鏈幫助像問題就在這裏?基本上github沒有舉例,你有嗎? – 2014-01-17 12:59:35

3

rails before_filter概念與連接中的中間件概念密切相關,這是express的一部分。你可以手動設置它,方法是在每個與照片相關的路由前加上你的認證功能,或者使用像TJ這樣的高級別的東西。要手工做只會是這樣的(僞CoffeeScript的)問題

myAuthMiddleware = (req, res, next) -> 
    if not req.session.user? 
    res.redirect "/" 
    else 
    next() 

editPhoto = (req, res) -> 
    .... 

deletePhoto = (req, res) -> 
    .... 

app.use(myAuthMiddleware, func) for func in [editPhoto, deletePhoto] 

那是什麼要說的是使用myAuthMiddleware喜歡的editPhotodeletePhoto中間件功能的before_filter。