Nodejs中间件延迟请求



我正在编写一个中间件,该中间件将执行一系列动作。序列完成后,我希望中间件致电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,只有在完成的所有请求时,我才想在迄今为止的所有请求下调用Next()。

实现这一目标的最佳方法是什么?

谢谢li

如果我正确理解,您要执行任务并处理所有请求后完成了所有请求吗?直到那碰巧他们等待?

因此,这是不可扩展的方式:

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对象。为了在计算机之间执行此操作,您可能必须向其他服务器向其他服务器发出请求并类似地处理请求。

警告:您想做的事情看起来像是一个非常非常糟糕的主意。毕竟所有请求不应彼此依赖。这很容易导致服务器崩溃。

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

}

相关内容

  • 没有找到相关文章

最新更新