2012-01-06 69 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。