2016-05-08 12 views
0

ノードエクスプレスアプリでは、すべてのリクエストではなく多くのリクエストで関数を呼び出す最も良い方法は何ですか? (例は、ユーザーが現在ログインしているかどうかをチェックする関数になります)Expressアプリケーション - すべてのリクエストではなく多くのリクエストで関数を実行

私が行ったのは、checkLogin(...)関数をエクスポートするモジュールを定義し、対応する各api-requestでこの関数を呼び出すことでした。例:

モジュールAUTH:/インデックスの

module.exports = { 
    checkLogin: function(req, res, next) { 
     if (req.session.hasOwnProperty('user')) { 
      //if the user is logged in we pass through 
      next(); 
     } else if (req.cookies.user == undefined || req.cookies.pass == undefined) { 
      res.render('login', { title: 'Login' }); 
     } else { 
      User.checkLogin(req.cookies.user, req.cookies.pass, true, function(o) { 
       if (o != null) { 
        req.session.user = o; 
        next(); 
       } else { 
        res.render('login', { title: 'Login' }); 
        return; 
       } 
      }); 
     } 
    } 
}; 

ルート:別のルートファイルで

//... 
var auth = require('../middlewares/auth.js'); 
//... 
    router.get('/index', auth.checkLogin, function(req, res) { 

     //if we passed the auth.checkLogin step we render the index page 
     res.render('index', { 
      title: 'Index', 
      udata: req.session.user 
     }); 

    }); 

//... 
var auth = require('../middlewares/auth.js'); 
//... 
     router.get('/user/someAPICall', auth.checkLogin, function(req, res) { 
      ... 
     }); 

が行くかが優れているために、この方法です。それを行う方法?私は、各ルートにapp.use(function(){..})を使用して含めることができるミドルウェア機能を定義することができました。問題は、このルートのすべての要求が、私が望むものではないこの機能を経由することです。

答えて

1

ルーター(http://expressjs.com/en/guide/routing.html)は、アプリケーションを設計するうえで最適な方法です。 URLパスを名前空間と考えることができ、ユーザー認証が必要な名前空間のルーターを作成できます。 あなたのメインの/indexページは、プレゼンテーション目的で使用されているため、ログインにすぐにリダイレクトする必要はありません。必要に応じて、上記のようにauth.checkLoginを含めてください。あなたは、ユーザーが必要とする他のすべてが(例えば、すべて/user/*下)に認証されるためには

は、あなたがより良い

const router = express.Router(); 
router.use(auth.checkLogin); 
router.get('/someAPICall', fn1, fn2); 
router.get('/someOtherAPICall', fn3, fn4); 

は、その後、あなたの親ルータまたはメインアプリで、ちょうど含めるスコープのルータを作成したいですルータ:

app.use('/user', router); 

だけの定義のようなものです:

app.use('/user/someAPICall', [auth.checkLogin, fn1, fn2]); 
app.use('/user/someOtherAPICall', [auth.checkLogin, fn3, fn3]); 

これは、モジュール式のルートハンドラを作成する利点をもたらします。調整や再利用などを容易にすると同時に、auth.checkLoginを保持しますが、ルータの入力時に常に実行されますが、ルータ。

簡潔に言えば、「ルータ内のすべてのルートで機能を実行しますが、すべてアプリリクエスト」ではありません。

この方法でルートを再設計できない場合は、使用するパスのハンドラリストに常にauth.checkLoginを含める必要があります。

+0

完璧、ありがとうございます! – eol

関連する問題