2014-01-09 2 views
3

저는 Node.js에 대해 C#에서 한 번 작성한 유틸리티 응용 프로그램을 다시 만들려고 노력하고 있습니다. 나는 내가 쓰고있는 프로그램 중 하나에서 어떤 일이 일어나고 있는지 혼란 스럽다. 이 프로그램이 원하는 것은 파일 시스템에 파일을 열고, 그 파일을 gzip 한 다음 gzipped 데이터를 다른 서버로 보냅니다. 테스트를 위해 "gzip으로 압축 된 데이터를 파일 시스템에 저장 한 다음 다시 읽음으로써 제대로되었는지 확인했습니다."스트림이 종료 된 후에 만 ​​Node.js 함수가 실행되도록하려면 어떻게해야합니까?

그래서 나는 내 프로그램이 할 기대하는 것입니다 :

  1. 출력 파일을 만듭니다.
  2. 인쇄 "생성 된 테스트 출력 파일".
  3. 인쇄 "데이터를 다시 읽으려고합니다."
  4. 파일을 읽으십시오.
  5. 일반 텍스트를 콘솔에 출력하십시오.

    1. 출력 파일이 생성됩니다 : 대신에 어떻게됩니까

    .

  6. "데이터를 다시 읽으려고합니다." 인쇄됩니다.
  7. "테스트 출력 파일을 만들었습니다." 인쇄됩니다.
  8. 콘솔 출력이 없습니다. 여기

내 코드입니다 (내 스타일이 끔찍한하십시오 경우 나 돌을 던져하지 않습니다!) :

var inputFilePath = "data.xml"; 
var fs = require('fs'); 
var zlib = require('zlib'); 

var inputStream = fs.createReadStream(inputFilePath) 
    .on('end', function() { 
     console.log("Created test output file."); 
    }); 

var gzipStream = zlib.createGzip(); 
inputStream.pipe(gzipStream); 

var outputFile = fs.createWriteStream('output.gzip'); 
gzipStream.pipe(outputFile); 

console.log('Attempting to re-read the data.'); 
var testInput = fs.createReadStream('output.gzip'); 
var unzip = zlib.createGunzip(); 
testInput.pipe(unzip).on('data', function(chunk) { 
    console.log(chunk.toString('utf8')); 
}); 

을 나는 의심 해요 스트리밍 물건을 비동기 적으로 발생, 내가 볼 이유입니다 콘솔 출력이 예상보다 다른 순서로 출력됩니다. 사실이라면 출력 파일을 열려고하기 전에 출력 파일을 준비해야하므로 문제가됩니다. 내가 writable.end()를 발견하고 그 해결책이 될 것이라고 생각하지만 다양한 장소에서 그것을 호출 할 때 내가 무슨 일을 이해하지 않습니다

  • 을 내가 파일을 읽을하기 전에 outputFile.end()를 호출 할 경우, 출력 파일이 비어 있습니다. 필자는 쓰기가 일어나기 전에 스트림을 닫았 기 때문이라고 생각합니다.
  • gzipStream.end()을 대신 호출하면 "테스트 출력 파일 생성"메시지가 표시되지 않지만 생성됩니다.

편집

나는 두 번째 부분을 알아 냈어. 주어진 코드에서 unzip 스트림 에서 data 이벤트에 대한 처리기를 설정해야합니다. 전에 pipe()이라고합니다. 코드가 지금 설정되는 방식으로 파이프에서 반환 된 스트림에서 이벤트를 처리하도록 설정하고 있지만 스트림에서 읽지 않으므로 처리기가 호출되지 않습니다.

+0

이 모든 비동기 것을 nodejs에 대한 모든 일이 아니다 –

+0

아 방법은 그것이 작동되도록 할 수 있습니다.?. 당신의 의견에 영감을 얻었습니다. 그 트릭은 inputStream의'end'에 응답하여 출력 파일을 필요로하는 코드 부분을 만드는 것입니다. 예제를 사용하여 여러분의 주석을 대답으로 변환 할 수 있다면 기쁠 것입니다 그것을 받아들이십시오. – OwenP

답변

0

나는이 솔루션을 우연히 발견했다. 개념적으로는 명령을 표현하는 방법처럼 보입니다. "입력 스트림에 더 이상 데이터가 없으면 생성 된 출력 파일을 처리하기 시작합니다."크게 단순화 :

pipe() 호출은 호출하는 다음 inputStream, gzipStream 웁니다 testOutput()

관련 문제