저는 Node.js에 대해 C#에서 한 번 작성한 유틸리티 응용 프로그램을 다시 만들려고 노력하고 있습니다. 나는 내가 쓰고있는 프로그램 중 하나에서 어떤 일이 일어나고 있는지 혼란 스럽다. 이 프로그램이 원하는 것은 파일 시스템에 파일을 열고, 그 파일을 gzip 한 다음 gzipped 데이터를 다른 서버로 보냅니다. 테스트를 위해 "gzip으로 압축 된 데이터를 파일 시스템에 저장 한 다음 다시 읽음으로써 제대로되었는지 확인했습니다."스트림이 종료 된 후에 만 Node.js 함수가 실행되도록하려면 어떻게해야합니까?
그래서 나는 내 프로그램이 할 기대하는 것입니다 :
- 출력 파일을 만듭니다.
- 인쇄 "생성 된 테스트 출력 파일".
- 인쇄 "데이터를 다시 읽으려고합니다."
- 파일을 읽으십시오.
- 일반 텍스트를 콘솔에 출력하십시오.
- 출력 파일이 생성됩니다 : 대신에 어떻게됩니까
.
- "데이터를 다시 읽으려고합니다." 인쇄됩니다.
- "테스트 출력 파일을 만들었습니다." 인쇄됩니다.
- 콘솔 출력이 없습니다. 여기
내 코드입니다 (내 스타일이 끔찍한하십시오 경우 나 돌을 던져하지 않습니다!) :
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()
이라고합니다. 코드가 지금 설정되는 방식으로 파이프에서 반환 된 스트림에서 이벤트를 처리하도록 설정하고 있지만 스트림에서 읽지 않으므로 처리기가 호출되지 않습니다.
이 모든 비동기 것을 nodejs에 대한 모든 일이 아니다 –
아 방법은 그것이 작동되도록 할 수 있습니다.?. 당신의 의견에 영감을 얻었습니다. 그 트릭은 inputStream의'end'에 응답하여 출력 파일을 필요로하는 코드 부분을 만드는 것입니다. 예제를 사용하여 여러분의 주석을 대답으로 변환 할 수 있다면 기쁠 것입니다 그것을 받아들이십시오. – OwenP