2012-01-06 62 views
11

Quiero hacer un filtro como los rieles antes de filtrar en express.js. Tengo un archivo llamado photo.js donde estoy colocando todas mis rutas relacionadas con fotos allí. Pero necesito redireccionar a la página de inicio de sesión al usuario que no está autenticado en mi sistema. Quiero hacer un beforeFilter por lo que entonces no necesito poner esa lógica en todos mis rutas ...Filtros en express.js

Gracias

Respuesta

14

Si desea mantener todo en su archivo photo.js, creo que un mejor enfoque es usar app.all y pasar múltiples devoluciones de llamada (que funcionan como middleware en el enrutamiento) integradas en el enrutamiento de la aplicación. Por ejemplo

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'); 
}); 

Dónde requireAuthentication y loadUser son funciones.

miren la documentación para app.VERB y app.all en http://expressjs.com/api.html#app.all

+0

Usar 'todo' es un gran enfoque. Lo estoy usando además de 'express-'resource para mis rutas, y lo complementa muy bien para autenticación y autorización. – JohnnyCoder

3

Hay extensiones o marcos de nivel superior como express-resource.

+0

¿Cómo expresa en recursos ayuda en la cadena de responsabilidad/filtro como el problema aquí? Básicamente, el github no da ningún ejemplo, ¿tienes uno? –

3

El concepto de rieles before_filter se relaciona estrechamente con el concepto de middleware de connect, que es parte de express. Puede configurarlo de forma manual precediendo cada ruta relacionada con la fotografía con su función de autenticación, o usar algo de alto nivel como TJ ha mencionado. Para hacerlo de forma manual no sería más que una cuestión de algo como esto (pseudo-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] 

Lo que está diciendo es utilizar myAuthMiddleware como un before_filter para las funciones editPhoto y deletePhoto middleware.