2017-01-18 681 views
4

Node-http-proxy에서 응답 스트림을 변환하려고 시도하는 일부 미들웨어를 연결하기 위해 Connect를 사용하는 노드 서버가 있습니다. 경우에 따라 이러한 변환은 매우 느릴 수 있으며 이러한 경우 변환을 포함하지 않거나 부분 적용을 포함하는 응답을 단순히 반환하는 것이 바람직합니다.느린 Connect 미들웨어를 타임 아웃하고 대신 노드 응답을 반환 할 수 있습니까?

제 애플리케이션에서 변환 미들웨어의 컨텍스트에서 next을 호출하기 위해 setTimeout을 호출하려고 시도했습니다. 이것은 일반적으로 작동하지만 미들웨어가 이미 next 다음 setTimeout 화재를 호출 한 경우 경쟁 조건을 노출하고 오류가 같은 것을 보이는 발생 동일하지 : 나는 같은 Error 인스턴스와 next를 호출 setTimeout 진화 결국 Error: Can't set headers after they are sent.

의 첫 번째 인수를 누른 다음 나중에 내 미들웨어 체인에서 그 오류를 잡을 수 res.headersSent했다 falseres.end.call(res) 통해 응답을 보내는 것이라고 가정합니다. 이것은 효과적이었고 놀랍게도 타임 아웃을 거의 아무것도 설정할 수 없었습니다. 응답이 훨씬 빨라지고 완벽 해졌습니다.

나는이 마지막 방법이 약간의 해킹이며 같은 경쟁 조건에서 벗어난 것이 아니라 조금 더 탄력적 인 것처럼 느껴진다. 그래서 저는 Node와 Connect가 이런 종류의 일을 처리하기 위해 어떤 종류의 관용적 접근법을 사용하고 있는지 알고 싶습니다.

어떻게 느린 미들웨어를 시간 초과하고 단순히 응답 스트림을 반환 할 수 있습니까?

현재이 문제는 내가 원하는 것, 더 많거나 적은 것, 그러나 다시 약간의 심한 느낌을줍니다.

let resTimedout = false; 
const timeout = setTimeout(() => { 
    if (!resTimedout) { 
    resTimedout = true; 
    next(); 
    } 
}, 100); 


getSelectors(headers, uri, (selectors) => { 
    const resSelectors = Object.keys(selectors).map((selector) => { 
    ... 
    }; 

    const rewrite = resRewrite(resSelectors); 
    rewrite(req, res,() => { 
    if (!resTimedout) { 
     resTimedout = true; 
     clearTimeout(timeout); 
     next(); 
    } 
    }); 
}); 
+0

'Promise.race' 및 async.race http://bluebirdjs.com/docs/api/promise.race.html, http://caolan.github.io/async/docs에서 확인할 수 있습니다. html # race – Sangharsh

답변

0

사용 async.timeout 또는 Promise.timeout 당신은 전역 변수에 대한 필요성을 제거하고 요청에 따라이를 결정할 수 :

const rewrite = resRewrite(resSelectors); 
rewrite(req, res,() => { 
    // set a timer to fail the function early 
    let timer = setTimeout(() => { 
     timer = null; 
     next(); 
    }, 100); 

    // do the slow response transformation 
    transformResponse((err, data) => { // eg. callback handler 
     clearTimeout(timer); 
     if (timer) next(); 
    }); 
}); 

가 작동하는 방법

타이머가 먼저 끝나면 null로 설정되고 next()가 호출됩니다. 변환 함수가 끝나면 timeout이 null이고 next()를 호출하지 않는다는 것을 알 수 있습니다.

응답 변환이 빠르면 다음에 나중에 실행되지 않도록 제한 시간을 지 웁니다.

+0

귀하의 질의가 해결되면 동의하십시오. – Sangharsh