7

私はConnectとExpress用のミドルウェアを作成しましたが、そのセットアップ方法にはかなりの労力が必要です。初期化タスクの性質上、これは非同期であるため、初期化が実行された後にのみミドルウェアにアクセスできるという問題があります。

現在、コールバックを使用して解決しました。

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

これは機能しますが、発信者にとっては良くありません。できる代わりに

app.use(setupMiddleware());

私がしなければなりません:

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

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

どうすればこれを解決できますか?ここで使用する必要のあるアイデアやベストプラクティスはありますか?

4

2 に答える 2

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);

このコードは最適化またはリファクタリングされていないことに注意してください。これは、アイデア自体が機能することを示すためのものです。

于 2013-03-22T15:04:31.397 に答える
0

なぜあなたは次のようにしないのですか、

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

});
于 2013-03-22T13:18:35.410 に答える