2017-05-07 2 views
0

私の/appルートで2つのミドルウェアを使用しようとしていますが、そのルートではユーザー認証とそのアカウントの状態を確認します。私は両方のミドルウェアを用意していますが、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では、最初に「開く」でなければなりませんURLのルートを追加します。ルートの残りの部分が続く

router.use(isLoggedIn, accountStatus); 

:制限ミドルウェアが続く

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

このように、/app/settings/billingのリクエストは、ミドルウェアをまったく受け継がれず、リダイレクトループも発生しません。

isLoggedInの場合は/appで始まるルートは、あなたが同様の方法でそれを使用することができますのために必須である:

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

これは素晴らしいソリューションです!うまくいけばあなたが答えるのを助けることができる2つの簡単な質問。 1. '/ login'は私の' site-routes.js'ファイルで定義されているルートです。 'app-routes.js' accountStatusミドルウェア内でこのルートにリダイレクトを追加したにもかかわらず、両方のファイルが' router'に '.use'で接続されているので、ルートを認識する必要があります。 2.私は '/ settings/billing'を' accountStatus'ミドルウェアに固定していますが、 'router'にアタッチされているため、グローバルにアクセス可能ですか? – cphill

+0

1.はい。リダイレクトは、純粋にクライアントに別のページに移動するための指示です。そのページが存在する限り、動作するはずです。 Expressには、特別な処理はありません。 2.「ミドルウェアに固定」されていることを確認できません。 '/ app/settings/billing'が呼び出されたときに' accountStatus'ミドルウェアが呼び出されるべきではありません(少なくとも、それはあなたが望むものですか、それとも質問を誤解しましたか?)。 – robertklep

+0

それはすべて意味がありません。手伝ってくれてどうもありがとう! – cphill

関連する問題