2012-10-25 2 views
0

일련의 작업을 수행 할 미들웨어를 작성하고 있습니다. 시퀀스가 완료된 후 미들웨어가 next()를 호출하기를 원합니다. 미들웨어의이 시점부터 중복됩니다. (의 setTimeout의 호출에 의해 조롱 여기에 일련의 작업) : 나는 다음과 같은 코드를 작성했습니다 작업이 완료되기 전에 둘 이상의 요청이 도착하면nodejs 미들웨어 요청 지연

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()를 호출하려고합니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

감사합니다, 리

난 당신이 작업을 수행하고 작업이 완료되면 모든 요청을 처리하려면 제대로 이해하고

답변

1

? 그 때까지 그들은 기다린다? 당신이 기계 사이 EventManager 객체를 공유 할 수 있기 때문에,

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

은 분명히이 확장되지 않습니다 :

그래서 여기가 아닌 확장 가능한 방법입니다. 기계간에이를 수행하려면 주 서버에서 다른 모든 서버로 요청을 발사하고 마찬가지로 요청을 처리해야합니다.

경고 : 당신이하려는 것은 매우 나쁜 생각입니다. 모든 요청이 서로 의존하지 않아야합니다. 이렇게하면 쉽게 서버가 손상 될 수 있습니다.

+0

감사합니다, req에, 어쩌면 이것은 나쁜 생각이지만 나는 확실히 어떤 동작을 수행 할 경우 내가해야 할 일을 제안 할 내 요청을 처리하기 전에? 내 모든 요청이 작성하는 데 시간이 걸릴 수있는 테이블 작성에 의존한다고 가정 해보십시오.이 경우 더 나은 접근 방법이 있습니까? – user429400

+0

@ user429400 필자는 주기적으로 (예 : 초당 한 번) 정기적으로 테이블을 준비했는지 여부를 확인하는 자체 참조 기능을 넣는 것이 좋습니다 (물론 준비가되어 있음을 플래그로 표시해야합니다). 예를 들어 5 번 시도한 후에는 루프를 중단하고 '미안, 준비되지 않은 테이블 - 나중에 다시 시도하십시오'(이것은 요청이 내부적으로 루프되지 않는지 확인하는 것입니다)로 응답해야합니다. 그것이 내가 그렇게 할 수있는 방법이다. 또한 상자 밖에서 확장 가능합니다 (테이블을 저장하기 위해 데이터베이스를 사용한다고 가정). – freakish

0

설정 actionDone 변수이 방법

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

}