2013-06-25 94 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