2012-10-15 7 views
0

누군가 다음의 행동에 대한 이유를 설명해 주시겠습니까?노드 js express : 유효하지 않은 요청 데이터?

은 내가 nodejs/빠른 웹 서버를 가지고의 다음과 같은 코드가 포함 된 게시물 노선의 하나를 가정 해 봅시다 :

req.on('data', function() { console.log('data arrived'); }) 

이 코드는 예상 호출 할 때 콘솔에 '데이터가 도착'메시지를 기록으로 작동합니다. 그러나 다음 코드는 다음과 같습니다.

setTimeout(function() { req.on('data', function() { console.log('data arrived'); }) }, 1000); 

같은 상황에도 불구하고 아무 것도 인쇄하지 않습니다. 짧은 시간 후에 이벤트를 구독하면 요청 개체 스트림에 어떤 일이 발생합니까?

내가 필요한 이유는 내 서버에 대용량 파일을 업로드하고 싶기 때문입니다. 게시물 요청이 도착하면 데이터베이스 항목을 만들고 데이터를 파이프에 파이프해야합니다. 잠재적 인 크기 때문에 메모리에 데이터 청크를 저장할 수는 없지만 데이터베이스 콜백 또는 모든 콜백 중 하나에서 요청 객체의 데이터를 가질 수는 없습니다.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까? 미리 감사드립니다.

req.pause(); 
doSometingAsync(function(result) { 
    req.on('data', function(data) { doSomethingWithData(data, result) }); 
    req.resume(); 
}); 

:하지만, 최종 목표는 다음과 같이 SG 할 것

req.pause(); 
setTimeout(function() { 
    req.on('data', function(data) { console.log('data arrived'); }) 
    req.resume(); 
}, 1000); 

UPDATE2

:

UPDATE

다음 코드는 여전히 작동하지 않습니다 이것은 작동하지 않는 것 같습니다 ...

,

UPDATE 아무것도없이 3

이것은 하나의 "경과"결과 :

req.pause() 
setTimeout() -> 
    console.log 'elapsed' 
    req.on 'error', (error) -> console.log error 
    req.on 'data', (data) -> console.log 'in data' 
    req.on 'end',() -> console.log 'end' 
    req.resume() 
, 2000 

답변

1

답변 : 데이터가 파일에 그것을 기록과 같은 데이터를 처리 도착하면

당신이 req.pause();을 해고 할 수 파일 쓰기 콜백이 발생하면 다음 패키지를 받으려면 req.resume();을 수행 할 수 있습니다. 이 앱 asyncronous을 유지하는 것, 물리적 하드 드라이브 속도 대역폭을 제한 할 req.on

이 대신 req.once를 사용 램 사용량을 낮출하지 않는 한 당신이하지 말아야 할 것을

는 "데이터"이벤트를 재정의합니다.

UPDATE 1 답 :이 같은

req.on("data", function (data) { 
    req.pause(); 
    /* do something with data like the following: */ 
    some_method(some_value, data, function (success) { 
     if (success) { 
      req.resume(); 
     } 
    }); 
}); 

또는 무언가 :

req.on("data", function (data) { 
    req.pause(); 
    console.log("data arrived"); 
    setTimeout(function(){req.resume();}, 1000); 
}); 

업데이트 2 답변 :이 여기

은 일부 의사 코드 당신이 콜백을 사용한다

이 경우의 세 번째 인수은이 기능이 완료 되 자마자 req.resume();을 발사합니다.

당신이 비동기를 유지하기 위해이 같은 콜백을 호출해야 외에 :

var doSomethingAsync = function (data, result, req) { 
    /* do something with data and result */ 
    process.nextTick(function() { 
     req.resume(); 
    }); 
}; 

req.pause(); 
doSomethingAsync(function (result) { 
    req.on('data', function (data) { 
     req.pause(); 
     doSomethingWithData(data, result, req); 
    }); 
    req.resume(); 
}); 
+0

물론 doSomethingAsync가 제대로 호출 콜백 메소드 :이 작업을 수행

var doSomethingAsync = function (data, result, cb) { /* do something with data and result */ process.nextTick(function() { cb(); }); }; req.pause(); doSomethingAsync(function (result) { req.on('data', function (data) { req.pause(); doSomethingWithData(data, result, function() { req.resume(); }); }); req.resume(); }); 

나. 콜백이 제대로 발생합니다. 주요 문제는 req.on 콜백의 코드가 결코 실행되지 않는다는 것입니다. – kataik

+0

req.resume()가 누락되었습니다.이 문제를 직접 조사하기 위해 자살 할 수 있습니다. 마지막 코드 스 니펫 중 하나를 시도해보십시오. – GottZ

+0

unfortunatelly 여전히 작동하지 않습니다. 내 마지막 예제를 확인해보십시오. 문제를 표시하려면 가능한 한 간단하게하십시오. – kataik

관련 문제