[node.js] 읽을 수있는 스트림을 닫는 방법 (종료 전)?

Node.js에서 읽을 수있는 스트림 을 닫는 방법은 무엇입니까?

var input = fs.createReadStream('lines.txt');

input.on('data', function(data) {
   // after closing the stream, this will not
   // be called again

   if (gotFirstLine) {
      // close this stream and continue the
      // instructions from this if
      console.log("Closed.");
   }
});

이것은 다음보다 낫습니다.

input.on('data', function(data) {
   if (isEnded) { return; }

   if (gotFirstLine) {
      isEnded = true;
      console.log("Closed.");
   }
});

그러나 이것은 읽기 과정을 멈추지 않습니다 …



답변

호출 input.close(). 문서에는 없지만

https://github.com/joyent/node/blob/cfcb1de130867197cbc9c6012b7e84e08e53d032/lib/fs.js#L1597-L1620

명확하게 작업을 수행합니다 isEnded. 🙂 실제로 .

2015 년 4 월 19 일 수정 아래 의견을 바탕으로 명확히하고 업데이트합니다.

  • 이 제안은 해킹이며 문서화되지 않았습니다.
  • 현재를 lib/fs.js살펴보면 1.5 년이 지난 후에도 여전히 작동합니다.
  • destroy()선호 하는 전화 에 대한 아래 의견에 동의합니다 .
  • 아래에서 올바르게 언급했듯이 이것은 fs ReadStreams일반이 아닌의Readable

일반적인 솔루션에 관해서는 : 적어도 문서에 대한 이해와 _stream_readable.js.

내 제안은 읽기 가능한 스트림을 일시 중지 모드로 설정하여 적어도 업스트림 데이터 소스에서 추가 처리를 방지합니다. 문서 에서 언급했듯이 실제로 일시 중지 되도록 unpipe()모든 data이벤트 리스너를 잊지 말고 제거하십시오.pause()


답변

편집 : 좋은 소식입니다! Node.js 8.0.0부터 readable.destroy공식적으로 사용할 수 있습니다 : https://nodejs.org/api/stream.html#stream_Readable_destroy_error

ReadStream.destroy

언제든지 ReadStream.destroy 함수를 호출 할 수 있습니다 .

var fs = require('fs');

var readStream = fs.createReadStream('lines.txt');
readStream
    .on('data', function (chunk) {
        console.log(chunk);
        readStream.destroy();
    })
    .on('end', function () {
        // This may not been called since we are destroying the stream
        // the first time 'data' event is received
        console.log('All the data in the file has been read');
    })
    .on('close', function (err) {
        console.log('Stream has been destroyed and file has been closed');
    });

공용 함수 ReadStream.destroy는 문서화되어 있지 않지만 (Node.js v0.12.2) GitHub 에서 소스 코드를 볼 수 있습니다 ( 2012 년 10 월 5 일 commit ).

destroy기능은 내부적으로 표시 ReadStream파괴되어 호출로 인스턴스를 close파일을 해제하는 기능.

close 이벤트 를 수신 하여 파일이 언제 닫혔는지 정확히 알 수 있습니다 . 종료 이벤트는 데이터가 완전히 소모되지 않는 한 발생하지 않습니다.


합니다 destroy(그리고 close) 기능에 고유 fs.ReadStream . 일반 stream.Readable “인터페이스”의 일부가 없습니다 .


답변

오늘, 노드 10에서

readableStream.destroy()

읽을 수있는 스트림을 닫는 공식적인 방법입니다.

참조 https://nodejs.org/api/stream.html#stream_readable_destroy_error를


답변

당신은 할 수 없습니다. Node 5.3.0부터 일반 읽기 가능 스트림 을 닫거나 / 종료 / 중단 / 파괴하는 문서화 된 방법이 없습니다 . 이것은 노드 스트림 아키텍처의 제한 사항입니다.

여기에 다른 답변이 설명했듯이 fs.ReadStream 과 같이 Node에서 제공하는 Readable의 특정 구현에 대한 문서화되지 않은 해킹이 있습니다 . 이것은 Readable에 대한 일반적인 솔루션이 아닙니다.

누군가 여기에서 내가 틀렸다는 것을 증명할 수 있다면 그렇게하십시오. 불가능하다고 말하는 것을 할 수 있기를 바라며, 시정되어 기쁩니다.

편집 : 내 해결 방법은 다음과 같습니다 . 복잡한 일련의 호출을 통해 파이프 라인을 구현하십시오 . .destroy()unpipe()그리고 그 모든 복잡성 이 있지만 모든 경우에 제대로 작동하지 않습니다 .

편집 : Node v8.0.0 destroy()은 읽기 가능한 스트림 에 대한 API를 추가했습니다 .


답변

버전 4.*.*에서 스트림에 null 값을 푸시하면 EOF신호 가 트리거됩니다 .

로부터 nodejs 워드 프로세서

null 이외의 값이 전달되면 push () 메서드는 후속 스트림 프로세서가 사용할 데이터 청크를 대기열에 추가합니다. null이 전달되면 스트림의 끝 (EOF)을 알리고 더 이상 데이터를 쓸 수 없습니다.

이 페이지에서 다른 많은 옵션을 시도한 후에 이것은 나를 위해 일했습니다.


답변

파괴 모듈은 스트림이 파괴되고 다른 API와 Node.js 버그를 처리하도록하기위한 것입니다. 지금은 최선의 선택 중 하나입니다.

NB. 노드 10에서는 .destroy추가 종속성없이 메서드를 사용할 수 있습니다 .


답변

를 사용하여 스트림을 지우고 닫을 수 있습니다. 그러면 스트림의 yourstream.resume()모든 항목이 덤프되고 결국 닫힙니다.

로부터 공식 문서 :

Readable.resume () :

귀국 :이

이 메서드는 읽을 수있는 스트림이 ‘데이터’이벤트 생성을 다시 시작하도록합니다.

이 방법은 스트림을 흐름 모드로 전환합니다. 스트림에서 데이터를 사용하고 싶지 않지만 ‘end’이벤트를 얻으려면 stream.resume ()을 호출하여 데이터 흐름을 열 수 있습니다.

var readable = getReadableStreamSomehow();
readable.resume();
readable.on('end', () => {
  console.log('got to the end, but did not read anything');
});