2013-03-22 16 views
7

私はConnect and Express用のミドルウェアを作成しましたが、その設定方法では重い作業が必要です。初期化タスクの性質上、このことは非同期であるため、初期化が実行された後にのみミドルウェアにアクセスできるという問題があります。Connectミドルウェアで非同期初期化を使用するにはどうすればよいですか?

現在、私は、コールバックを使用して、それを解決した:

function setupMiddleware(callback) { 
    doSomeAsyncInitialization(function() { 
    callback(function (req, res, next) { 
     // The actual middleware goes here ... 
    }); 
    }); 
} 

これは動作しますが、それは、発信者のための素晴らしいではありません。代わりに

app.use(setupMiddleware()); 

を行うことができるという私がしなければならない。

setupMiddleware(functin (middleware) { 
    app.use(middleware); 
}); 

は今、私はより良いアプローチは、例えば、あるかどうかを考えていましたミドルウェアがバックグラウンドで初期化され、ミドルウェアが準備ができるまですべての着信要求を遅延させます。

どうすればこの問題を解決できますか?ここで使用すべきアイディアやベストプラクティスは?次のようにあなたが好きですしていないのはなぜ

答えて

2

私は今、それがisInitialized変数を使用し、ミドルウェア機能自体を遅らせる解決しました。次の例を参照してください:

var connect = require('connect'); 

var setup = function() { 
    var isInitialized = false; 

    setTimeout(function() { 
    isInitialized = true; 
    }, 10000); 

    function run (req, res, next) { 
    res.write('Foo'); 
    res.end(); 
    } 

    function delay (req, res, next) { 
    if (isInitialized) { 
     return run(req, res, next); 
    } 

    setTimeout(function() { 
     delay(req, res, next); 
    }, 1000); 
    } 

    return function (req, res, next) { 
    if (req.url === '/foo') { 
     delay(req, res, next); 
     return; 
    } 
    next(); 
    } 
}; 

var app = connect(); 
app.use(setup()); 
app.use(function (req, res) { 
    res.write('Fertig!'); 
    res.end(); 
}); 

var http = require('http'); 

http.createServer(app).listen(5000); 

それだけでアイデア自体が機能することをデモで、このコードは、どのような方法で最適化やリファクタリングされていないことに注意してください。

0

doSomeAsyncInitialization(function() { 
    //After doing all long running init process just configure your express as follows. 
    app.use(<middlewares>); 
    app.listen(<portnumder>); 

}); 
+1

初期化は1つのミドルウェアのみであり、アプリ全体ではないためです。そして、このパターンはもちろん機能しますが、それは「良い」ものではありません。私はすべてが1つのステップでインデントされていることを嫌いです(これは単なるフォーマット上の問題ではありません;-))。 –

+0

私はそれを受け入れる。 Nodejsはノンブロッキングなので、長時間実行しているプロセスコールバックや質問に示された方法でコードを取得する必要があります。 Ofcourceでは、非同期モジュールを使用できます。ここでは、あなたのミドルウェアがすべての要求に対して必須であると仮定して、app.use()関数を使用するようにしました。そして私の提案は、ポートを聞き始める前にミドルウェアを初期化するだけです。フォーマット以外のことを期待しているなら、私は "doSomeAsyncInitialization"関数が何を行っているのかを理解する必要があります。 –

+0

まあまあ、セットアップ機能がミドルウェアを即座に返すというアイデアかもしれませんが、ミドルウェアは完全に初期化されるまで、入ってくるリクエストを遅らせるという考えがあります。 –

関連する問題