2013-06-25 58 views
0

我正在尝试编写中间件进行身份验证。我希望这个if语句将用户重定向到'/',如果他们是而不是登录。如果他们已经登录,我不想将它们重定向到'/ news'。expressjs有条件重定向

/*Simplified for this example*/ 

if(rs.authenticated === true) { 
    next(); 
} else { 
    res.redirect('/'); 
} 

有没有办法在这些if语句中做到这一点?或者我必须写一个新的方法?我用if语句尝试了几种方法,但我只是得到了重定向循环。

回答

1

标准模式将是需要登录的用户使用,用于验证中间件的所有页面登录的用户,如果他们没有登录,则重定向到/

function loggedIn(req, res, next) { 
    if(req.authenticated === true) { 
    next(); 
    } else { 
    res.redirect('/'); 
    } 
} 

app.get('/news', loggedIn, newsRoute); 
app.get('/', homeRoute); 

你的问题是你正在使用中间件的所有路线,当你真的只想使用它的受保护的路线,这是你的重定向循环发生的地方。如果您想将登录用户发送到'/ news'而不是'/',则可以只显示正确的模板或在其中执行条件重定向。

function homeRoute(req, res) { 
    if (req.authenticated) { 
     return res.redirect('/news'); 
    } 
    res.render('home'); 
} 
+0

的,如果在我的例子声明实际上是从一个方法(我用它来保护线路,auth.restrict),我有叫LOGGED_IN,我使用的非保护线路因此,如果他们已经登录的另一种方法在他们被重定向到'/ news'而不是停留在登录页面上。我只是想,如果我可以使用所有路线的一种方法。但是,也许使用两种不同的方法是更好的选择? – georgesamper

+0

那么你需要逻辑来避免重定向循环,所以你需要检查'req.path'并且只有在它们不是已经请求'/'的时候才将它们重定向到'/',或者遵循我的建议。 –

+0

如果我只是渲染视图,而不是重定向,则不会将数据传递给它。有没有办法解决这个问题? – georgesamper