2013-09-03 10 views
17

app.useで追加されたミドルウェアをスタックから削除するための標準的な方法はありますか?それはshould be possible to just modify the app.stack array directlyだと思われますが、最初に検討しなければならない文書化された方法があるかどうかは疑問です。Expressスタックからミドルウェアを削除する適切な方法はありますか?

+0

*適切な方法は不要なミドルウェアを追加することではありません。 – elmigranto

+0

@elmigrantoそれはあまりにも単純な見方です。特定の場合にミドルウェアの追加/削除が必要な場合がある、より動的な方法でExpressルーティングを使用する理由がたくさんあります。 – Brad

+0

ミドルウェアスタックがapp._router.stack – rocketspacer

答えて

17

useは実際にはConnect(Expressではない)から来て、all it really does is push the middleware function onto the app's stackです。

したがって、関数を配列から正しくスプライスするだけでよいはずです。

ただし、app.stackのドキュメントはありません。また、ミドルウェアを削除する機能もありません。将来のバージョンのConnectがコードと互換性のない変更を行うリスクがあります。

+3

にあるか、またはあなたのコードと互換性のない 'express 'を変更しています。 'express'はもはや' connect'に依存しないので、私はこれがもう動作しないと思います。 – trysis

2

これを行う方法は組み込まれていないようですが、小さなトリックで同じ結果を得ることができます。独自の配列のミドルウェア(dynamicMiddlewareと呼ぶ)を作成しますが、それをExpressにプッシュしないで、dynamicMiddlewareのすべてのハンドラを非同期で順番に実行するミドルウェアを1つだけ押します。私は今それをテストする機会を持っていないよう

const async = require('async') 

// Middleware 
const m1 = (req, res, next) => { 
    // do something here 
    next(); 
} 

const m2 = (req, res, next) => { 
    // do something here 
    next(); 
} 

const m3 = (req, res, next) => { 
    // do something here 
    next(); 
} 

let dynamicMiddleware = [m1, m2, m3] 

app.use((req, res, next) => { 
    // execute async handlers one by one 
    async.eachSeries(
     // array to iterate over 
     dynamicMiddleware, 
     // iteration function 
     (handler, callback) => { 
      // call handler with req, res, and callback as next 
      handler(req, res, callback) 
     }, 
     // final callback 
     (err) => { 
      if(err) { 
      // handle error as needed 

      } else { 
       // call next middleware 
       next() 
      } 
     } 
    ); 
}) 

コードが少し荒いですが、考え方は明確にする必要があります。arrayを通じて1つのミドルウェア内のすべての動的なハンドラの配列、その意志ループを包みます。配列にハンドラーを追加または削除すると、配列に残っているものだけが呼び出されます。

+0

これは必ずしも問題を解決するわけではありません。少なくとも私の場合、マウントポイントとマウント方法の扱いが異なることが重要です。内部スタックを変更することはまだ可能ですが、ちょっと動きました。 – Brad

+0

あなたのユースケースをもっと詳しく説明できますか?おそらく、あなたはこれを小さなモジュールで包んで、異なるマウントポイントで再利用できますか? – Gaafar

-1

私が知る限り、ミドルウェアを削除する方法はありません。ただし、ブール値フラグを割り当てて、いつでもミドルウェアを「非アクティブ化」することができます。

var middlewareA_isActivate = true; 
//Your middleware code 
function(req, res, next) { 
    if (!middlewareA_isActivate) next(); 
    //......... 
} 
//Deactivate middleware 
middlewareA_isActivate = false; 

EDIT:
ExpressJs(4.xの)コードを読んだ後、私はあなたがミドルウェアがapp._router.stackスタックビアアクセスできることがわかり、操作は私が推測する、そこから行きます。しかし、私はこの「秘密」が将来的には機能しないかもしれないと考えています
P/s:ミドルウェアスタックを直接操作する際にExpressがどのように動作するかはテストされていません

関連する問題