web-dev-qa-db-ja.com

ExpressJSの特定のルート用の複数のミドルウェアのチェーン

何かを確認したいだけなのですが、これに関してExpressのドキュメントやオンラインで何かを見つけることができませんでした(それが機能であることは知っていますが)。

私はこれをテストするだけでいいのですが、私は本当に素敵なテンプレートを持っていないので、コミュニティから聞いてみたいです。

次のようなエクスプレスでルートを定義する場合:

app.get('/', function (req, res) {
  res.send('GET request to homepage');
});

ミドルウェアを定義して直接ロードすることもできます。例えば

middleware = function(req, res){
  res.send('GET request to homepage');
});

app.get('/', middleware)

ただし、これらのルートの少なくとも1つをチェーンして、認証などの追加のミドルウェアを実行することもできます。

app.get('/', middleware, function (req, res) {
  res.send('GET request to homepage');
});

これらは無限に連鎖可能ですか?必要に応じて、指定されたルートに10個のミドルウェア機能を貼り付けることはできますか? app.getが受け入れることができるパラメーターを確認したいのですが、前述のようにドキュメントで見つけることができません。

45
Antoine

「無限に」と言っているわけではありませんが、複数のミドルウェア関数を追加できると書かれています(ドキュメントでは "callbacks"と呼ばれます) here

router.METHOD(パス、[コールバック、...]コールバック)

...

複数のコールバックを提供することができ、すべてが等しく扱われ、ミドルウェアのように動作しますが、これらのコールバックはnext( 'route')を呼び出してバイパスすることができます残りのルートコールバック。このメカニズムを使用して、ルートで前提条件を実行し、一致したルートを続行する理由がない場合に後続のルートに制御を渡すことができます。

ご覧のとおり、ミドルウェア関数と、一般的にリクエストを処理する関数(通常はリストに追加される最後の関数)との間に違いはありません。

10を持っていることは問題になりません(本当に必要な場合)。

37
robertklep

次の例を検討してください。

var middleware = {
    requireAuthentication: function(req, res, next) {
        console.log('private route list!');
        next();
    },
    logger: function(req, res, next) {
       console.log('Original request hit : '+req.originalUrl);
       next();
    }
}

次のコードを使用して、複数のミドルウェアを追加できるようになりました。

app.get('/', [middleware.requireAuthentication, middleware.logger], function(req, res) {
    res.send('Hello!');
});

したがって、上記のコードから、「requireAuthentication」と「logger」が追加された2つの異なるミドルウェアであることがわかります。

75
Ankur Soni