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()선호 하는 전화 에 대한 아래 의견에 동의합니다 .- 아래에서 올바르게 언급했듯이 이것은
fsReadStreams일반이 아닌의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');
});
