2012-12-03 8 views
5

Expressスタックにミドルウェアを挿入する方法はありますか?つまり、私のapp.jsをメインミドルウェアのチェーンに設定してから、他のモジュールを呼び出してアプリケーションインスタンスを渡して、もっとミドルウェアを挿入したいということです(例えば、正しい場所にパスポートを追加したい認証モジュール)Node.JS Expressアプリケーションにミドルウェアを挿入できます

答えて

9

にこのappを送ることができます。

あなたは、ミドルウェア内の任意の機能を追加することができます。もちろん、ミドルウェアの機能はの順番での順番で実行されるため、useを正しい順序で確実に呼び出すように十分注意する必要があります。

がapp.js

var app = express(); 
// ... 

app.use(express.logger()); // first middleware function 

var someOtherModule = require('./mod.js'); 
someOtherModule.init(app); 

app.use(express.static()); // last middleware function) 

mod.js

exports.init = function(app) { 
    app.use(function(req, res, next) { 

    }); 
}; 

限り実際あなたがすでに呼び出さした後、スタックの真ん中にミドルウェア機能(を注入app.use)には、文書化された方法はありません。 useはスタックの最後にのみ関数を追加します。

useは実際にproto.jsにConnectによって供給されている:

app.use = function(route, fn){ 

    ... 

    this.stack.push({ route: route, handle: fn }); 

    return this; 
}; 

技術、あなたが自分app.stackをいじることができますが、が、私はこれしないだろう。変更される可能性がある、文書化されていない実装の詳細をいじっています。つまり、への今後のアップデートは、 ConnectまたはExpressによってアプリが壊れる可能性があります。

+0

ありがとうございました - 私は方法があるとは思わなかった(それが置かれる場所を言う簡単な方法を考えることができない)。私はおそらくあなたが正面を示唆する方法で行くつもりです。 – MrPurpleStreak

+0

注文が重要であることを示す巨大な勝利!ありがとう! – JWally

0

問題は何か分かりませんか?

app.use(function(req,res,next){ 
    //some munipulation with req and res 
    next() 
}) 

を、あなたは確かに他のモジュールにごappオブジェクトを渡し、そこuseを呼び出すことができますしているmoduls

+1

私は問題は、 'app.use'はスタックの最後に*ミドルウェア機能を追加しているため、前に追加されたミドルウェアが関数を実行する前に要求を完了できることです。 – josh3736

+0

たとえば?それはいつ必要ですか? –

+0

物事をよりモジュラーに保つために、authenticate.jsですべての認証を行いたいと思っています。パスポートオブジェクトをそこに作成して渡すのではなく、アプリを渡して、そのモジュールがパスポートを追加したいと思っています。 express.sessionの直後でルータの前にpassport.sessionミドルウェアを初期化してください。 – MrPurpleStreak

1

あなたはapp.use(FN)を使用するか、このようにそれらを積み重ねることができます。

app.get('/foo', fn1, fn2, fn3); 

署名は常に同じになると)(次呼び出す必要があります。

関連する問題