답변:
노드 10.17부터 stream.Readable은 from
iterable (배열 리터럴 포함)에서 쉽게 스트림을 생성 하는 방법을 가지고 있습니다.
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
최소한 10.17과 12.3 사이에서 문자열 자체는 반복 가능하므로 Readable.from("input string")
작동하지만 문자 당 하나의 이벤트를 생성합니다. Readable.from(["input string"])
배열의 항목 당 하나의 이벤트 (이 경우 하나의 항목)를 생성합니다.
또한 이후 노드 (아마도 12.3, 문서에서 함수가 변경되었다고 말했기 때문에)에서 더 이상 문자열을 배열로 래핑 할 필요가 없습니다.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
으로 @substack이 저를 수정 #node , 새로운 스트림 API 노드 V10에이 쉽게 :
const Readable = require('stream').Readable;
const s = new Readable();
s._read = () => {}; // redundant? see update below
s.push('your text here');
s.push(null);
그 후에 자유롭게 파이프를 만들거나 원하는 소비자에게 전달할 수 있습니다.
이력서 한 줄짜리 만큼 깨끗 하지는 않지만 여분의 의존성을 피합니다.
( 업데이트 : v0.10.26부터 v9.2.1까지는 설정하지 않은 경우 push
REPL 프롬프트에서 직접 호출 하면 not implemented
예외 가 발생합니다 _read
. 함수 나 스크립트 내에서 충돌 하지 않습니다 . 긴장, 포함하십시오 noop
.)
_read
기본 자원에서 데이터를 가져올 방법을."
null
스트림 버퍼에 밀어 넣습니까?
null
은 모든 데이터를 읽고 스트림을 닫았다 고 스트림에 알려줍니다.
readable.push()
메소드는 Readable Implementers에 의해서만 호출되며 readable._read()
메소드 내에서만 호출됩니다 ."
Jo Liss의 이력서 답변을 사용하지 마십시오. 대부분의 경우 작동하지만 제 경우에는 4 ~ 5 시간 동안 버그를 찾지 못했습니다. 이를 위해 타사 모듈이 필요하지 않습니다.
새로운 답변 :
var Readable = require('stream').Readable
var s = new Readable()
s.push('beep') // the string you want
s.push(null) // indicates end-of-file basically - the end of the stream
이것은 완전 호환 가능한 읽기 가능 스트림이어야합니다. 스트림을 올바르게 사용하는 방법에 대한 자세한 내용은 여기 를 참조하십시오 .
구식 답변 : 기본 PassThrough 스트림을 사용하십시오.
var stream = require("stream")
var a = new stream.PassThrough()
a.write("your string")
a.end()
a.pipe(process.stdout) // piping will work as normal
/*stream.on('data', function(x) {
// using the 'data' event works too
console.log('data '+x)
})*/
/*setTimeout(function() {
// you can even pipe after the scheduler has had time to do other things
a.pipe(process.stdout)
},100)*/
a.on('end', function() {
console.log('ended') // the end event will be called properly
})
'close'이벤트는 생성되지 않습니다 (스트림 인터페이스에는 필요하지 않음).
stream
모듈 의 새 인스턴스를 만들고 필요에 따라 사용자 정의하십시오.
var Stream = require('stream');
var stream = new Stream();
stream.pipe = function(dest) {
dest.write('your string');
return dest;
};
stream.pipe(process.stdout); // in this case the terminal, change to ya-csv
또는
var Stream = require('stream');
var stream = new Stream();
stream.on('data', function(data) {
process.stdout.write(data); // change process.stdout to ya-csv
});
stream.emit('data', 'this is my string');
pipe()
최소한 대상 스트림을 반환해야합니다.
편집 : Garth의 대답 이 더 낫습니다.
내 이전 답변 텍스트는 아래에 유지됩니다.
스트림에 문자열을 변환하려면, 당신은이 일시 사용 을 통해 스트림 :
through().pause().queue('your string').end()
예:
var through = require('through')
// Create a paused stream and buffer some data into it:
var stream = through().pause().queue('your string').end()
// Pass stream around:
callback(null, stream)
// Now that a consumer has attached, remember to resume the stream:
stream.resume()
resumer
꽤 잘 작동했습니다. 감사!
그 모듈이 있습니다 : https://www.npmjs.com/package/string-to-stream
var str = require('string-to-stream')
str('hi there').pipe(process.stdout) // => 'hi there'
다른 해결책은 read 함수를 Readable의 생성자에 전달하는 것입니다 (cf doc stream readeable 옵션 )
var s = new Readable({read(size) {
this.push("your string here")
this.push(null)
}});
예를 들어 s.pipe를 사용한 후
6 개월마다 이것을 다시 배우는 데 지쳤으므로 구현 세부 정보를 추상화하기 위해 npm 모듈을 게시했습니다.
https://www.npmjs.com/package/streamify-string
이것이 모듈의 핵심입니다 :
const Readable = require('stream').Readable;
const util = require('util');
function Streamify(str, options) {
if (! (this instanceof Streamify)) {
return new Streamify(str, options);
}
Readable.call(this, options);
this.str = str;
}
util.inherits(Streamify, Readable);
Streamify.prototype._read = function (size) {
var chunk = this.str.slice(0, size);
if (chunk) {
this.str = this.str.slice(size);
this.push(chunk);
}
else {
this.push(null);
}
};
module.exports = Streamify;
str
는 IS string
invokation에 생성자로 전달되어야하며, 데이터 등의 스트림으로 출력 될 것이다. 설명서에options
따라 스트림으로 전달 될 수있는 일반적인 옵션입니다. .
Travis CI에 따르면 대부분의 노드 버전과 호환되어야합니다.
TypeScript의 깔끔한 솔루션은 다음과 같습니다.
import { Readable } from 'stream'
class ReadableString extends Readable {
private sent = false
constructor(
private str: string
) {
super();
}
_read() {
if (!this.sent) {
this.push(Buffer.from(this.str));
this.sent = true
}
else {
this.push(null)
}
}
}
const stringStream = new ReadableString('string to be streamed...')
JavaScript는 오리 형식이므로 읽을 수있는 스트림의 API 만 복사 하면 제대로 작동합니다. 실제로, 대부분의 메소드를 구현하거나 스텁으로 남겨 둘 수는 없습니다. 라이브러리에서 사용하는 것만 구현하면됩니다. Node의 사전 빌드 EventEmitter
클래스 를 사용하여 이벤트도 처리 할 수 있으므로 구현할 필요가 없습니다.addListener
직접 .
CoffeeScript에서 구현하는 방법은 다음과 같습니다.
class StringStream extends require('events').EventEmitter
constructor: (@string) -> super()
readable: true
writable: false
setEncoding: -> throw 'not implemented'
pause: -> # nothing to do
resume: -> # nothing to do
destroy: -> # nothing to do
pipe: -> throw 'not implemented'
send: ->
@emit 'data', @string
@emit 'end'
그런 다음 다음과 같이 사용할 수 있습니다.
stream = new StringStream someString
doSomethingWith stream
stream.send()
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
내가 그것을 사용할 때new StringStream(str).send()
stream.Readable
@Garth Kidd가 제안한 것과 같은 새로운 인스턴스를 만드십시오.
stream.Readable
존재하지 않았습니다 .