2017-05-07 80 views
0

我想用我的/app路由使用兩個中間件來檢查用戶身份驗證,然後檢查其帳戶的狀態。我有兩個中間件,但我在遇到無法重定向的情況下,我的req.session.accountStatus與我提供的條件不符。一般來說,我試圖強制用戶只能訪問被重定向到的頁面。我是否以錯誤的方式使用中間件?有更好的方法嗎?ExpressJS - 中間件太多重定向

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()){ 
     return next(); 
    } 
    res.redirect('/login'); 
} 

function accountStatus(req, res, next) { 
    if(req.session.accountStatus == "active" || req.session.accountStatus == "trialing"){ 
     return next(); 
    } else { 
     //Endless loop. Need to fix 
     res.redirect('/app/settings/billing'); 
    } 
} 

router.use(require('./site-routes')); 
router.use('/app', isLoggedIn, accountStatus, require('./app-routes')); 

回答

2

它可能更容易中間件移動到app-router.js

所以,你的主文件只做到這一點:

router.use('/app', require('./app-routes')); 

app-routes.js,請先添加路線,應該是「開放」的網址;

router.get('/settings/billing', ...); 

其次是限制性的中間件:

router.use(isLoggedIn, accountStatus); 

其次路線的其餘部分。

這樣,/app/settings/billing的任何請求都不會通過中間件傳遞,也不會導致重定向循環。

如果isLoggedIn是強制性的/app開頭的路線,你可以以類似的方式使用它:

router.use(isLoggedIn); 
router.get('/settings/billing', ...); 
router.use(accountStatus); 
router.get(...); 
+0

這是一個很好的解決方案!兩個簡短的問題,希望你能幫助回答。 1.'/ login'是一個在我的'site-routes.js'文件中定義的路由。儘管在'app-routes.js' accountStatus中間件中添加了一個重定向到這條路由,它應該識別這條路由,因爲這兩個文件都通過'.use'附加到'router',對嗎? 2.即使我將'/ settings/billing'錨定到'accountStatus'中間件,由於它連接到'router',它仍然可以全局訪問嗎? – cphill

+0

1.是的,重定向純粹是對客戶「去」另一頁的指示。只要該頁面存在,它應該可以工作。 Express沒有「特殊處理」。 2.不確定「錨定到中間件」的含義。當調用'/ app/settings/billing'時,'accountStatus'中間件不應該被調用(至少,這就是你想要的,不是嗎?或者我誤解了這個問題?)。 – robertklep

+0

不用這一切都有道理。非常感謝你的幫助! – cphill