0

一連のアクションを実行するミドルウェアを作成しています。シーケンスが完了したら、ミドルウェアで next() を呼び出します。この時点から、ミドルウェアは冗長です。私は次のコードを書きました: (ここでは一連のアクションは setTimeout の呼び出しによってモックされています):

function myMiddleware(req, res, next){

   console.info("inside myMiddleware");

   if (actionDone) {
       console.info("middleware redundant. ActionDone, calling next");
       next();
   }

   setTimeout(doneWaiting, 30000);

   function doneWaiting(){
      actionDone = true;
      next();
   }
}

アクションが完了する前に複数のリクエストが到着すると、setTimeout が何度も呼び出されるため、このコードは機能しません。setTimeout を 1 回だけ呼び出し、それが完了したときにのみ、これまでに到着したすべてのリクエストに対して next() を呼び出したいと考えています。

これを達成するための最良の方法は何ですか?

ありがとう、リー

4

2 に答える 2

1

私の理解が正しければ、タスクを実行し、タスクが終了したらすべてのリクエストを処理したいですか? それが起こるまで、彼らは待ちますか?

したがって、スケーラブルでない方法は次のとおりです。

var EventManager = new require("events").EventEmitter( );
var actionDone = "start";

function myMiddleware(req, res, next){

   console.info("inside myMiddleware");
   var handler = function( ) {
       console.info("middleware redundant. ActionDone, calling next");
       next();
   };

   if (actionDone === "finished" ) {
       handler( );
       return;
   }

   EventManager.once( "finished", handler );

   if (actionDone !== "working") {
       actionDone = "working";
       function doneWaiting(){
          actionDone = "finished";
          EventManager.trigger( "finished" );
       }
       setTimeout(doneWaiting, 30000);
   }
}

EventManagerマシン間でオブジェクトを共有できないため、明らかにスケーラブルではありません。マシン間でこれを行うには、おそらくメインサーバーから他のすべてのサーバーにリクエストを送信し、同様にリクエストを処理する必要があります.

警告:あなたがやろうとしていることは、非常に悪い考えのように見えます。結局のところ、リクエストは互いに依存すべきではありません。これにより、サーバーがクラッシュする可能性があります。

于 2012-10-25T13:38:46.343 に答える
0

このように、actionDone変数をに設定しますreq

function myMiddleware(req, res, next){

console.info("inside myMiddleware");

if (req.actionDone) {
    console.info("middleware redundant. ActionDone, calling next");
    next();
}

setTimeout(doneWaiting, 30000);

function doneWaiting(){
   req.actionDone = true;
   next();
}

}

于 2012-10-25T20:38:16.673 に答える