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');
});