노드의 문자열에서 스트림을 만드는 방법.Js?
파일 또는 스트림 중 하나를 입력으로 예상하는 라이브러리 ya-csv를 사용하고 있지만 문자열이 있습니다.
이 문자열을 노드에서 스트림으로 변환하려면 어떻게 해야 합니까?
#node에서 @substack이 수정한 것처럼 노드 v10의 새로운 스트림 API를 사용하면 다음과 같이 쉽게 할 수 있습니다.
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
" "가 크래시됩니다.not implemented
를 설정하지 않은 _read
되지 함수나 스크립트 내에서 크래시 되지 않습니다.불안할 수 .noop
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
이 스트림은 완전히 호환되는 판독 가능한 스트림이어야 합니다.스트림을 올바르게 사용하는 방법에 대한 자세한 내용은 여기를 참조하십시오.
오래된 답변: 네이티브 패스를 사용하면 됩니다.스루 스트림:
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 이벤트는 송신되지 않습니다(스트림인터페이스에서는 필요하지 않습니다).
제10.17호 수 있는 것은 「」입니다.from
모든 반복 가능한 스트림(어레이 리터럴 포함)에서 쉽게 스트림을 생성하는 방법:
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"])
는 어레이 내의 항목당1개의 이벤트를 송신합니다(이 경우는 1개의 항목).
또, 이후의 노드(아마도 12.3)에서는, 그 때에 기능이 변경되었다고 메뉴얼에 기재되어 있기 때문에, 문자열을 배열로 랩 할 필요는 없습니다.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
새로운 보세요.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');
이전 답변 텍스트는 아래에 보존되어 있습니다.
스트링을 스트림으로 변환하려면 일시 중지된 스트림을 사용합니다.
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()
https://www.npmjs.com/package/string-to-stream에 있는 모듈입니다.
var str = require('string-to-stream')
str('hi there').pipe(process.stdout) // => 'hi there'
다른 솔루션은 읽기 기능을 Readable(cf doc stream readable 옵션)의 컨스트럭터에 전달하는 것입니다.
var s = new Readable({read(size) {
this.push("your string here")
this.push(null)
}});
당신은 예시로 s.pipe를 사용한 후에 할 수 있습니다.
커피 스크립트:
class StringStream extends Readable
constructor: (@str) ->
super()
_read: (size) ->
@push @str
@push null
사용:
new StringStream('text here').pipe(stream1).pipe(stream2)
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
는 는 입니다.string
호출 시 생성자에게 전달되어야 하며 스트림에 의해 데이터로 출력됩니다. 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...')
NodeJS에서는 몇 가지 방법으로 판독 가능한 스트림을 작성할 수 있습니다.
솔루션 1
하다, 하다, 하다, 하다, 이렇게 하면 돼요.fs
the. 함수 ★★fs.createReadStream()
를 사용하면 판독 가능한 스트림을 열 수 있으며 파일 경로를 통과하기만 하면 스트리밍이 시작됩니다.
const fs = require('fs');
const readable_stream = fs.createReadStream('file_path');
솔루션 2
파일을 만들지 않으려면 메모리 내 스트림을 만들고 다른 작업을 수행할 수 있습니다(예: 어딘가에 업로드)., 하다, 하다, 하다, 이렇게 할 수 요.stream
모듈.듈, 할 습 가져오기 니 다)를 가져올 수 있습니다.Readable
부에서stream
모듈 및 읽을 수 있습니다.읽을 수 있는 스트림을 만들 수 있습니다. When creating an object, you can also implement 오브젝트를 작성할 때 구현도입할 수 있습니다.read()
내부 버퍼의 데이터를 읽을 수 있는 방법내부 버퍼에서 데이터를 읽는 데 사용되는 메서드입니다.수 있는 는, 「」를 참조해 주세요.null
이 반환됩니다.인 thesize
인수에는 읽을 특정 바이트 수를 지정합니다. 경우,size
이치노내부 버퍼에 포함된 모든 데이터가 반환됩니다.
const Readable = require('stream').Readable;
const readable_stream = new Readable({
read(size) {
// ...
}
});
솔루션 3
네트워크를 통해 무언가를 가져오는 경우 스트림처럼 가져올 수 있습니다(예를 들어 일부 API에서 PDF 문서를 가져오는 경우).
const axios = require('axios');
const readable_stream = await axios({
method: 'get',
url: "pdf_resource_url",
responseType: 'stream'
}).data;
솔루션 4
서드파티 패키지는 스트림 생성을 기능으로 지원할 수 있습니다. 하는 이 좋다aws-sdk
S3
.
const file = await s3.getObject(params).createReadStream();
JavaScript는 오리 타입이므로 읽기 쉬운 스트림의 API를 복사하기만 하면 문제없이 동작합니다.실제로, 이러한 메서드의 대부분은 실장할 수 없거나, 스탭으로서 방치할 수 있습니다.실장할 필요가 있는 것은 라이브러리가 사용하는 것 뿐입니다.Node의 사전 구축 클래스를 사용하여 이벤트를 처리할 수도 있으므로 구현할 필요가 없습니다.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()
언급URL : https://stackoverflow.com/questions/12755997/how-to-create-streams-from-string-in-node-js
'programing' 카테고리의 다른 글
Axios를 사용하여 Vuex 스토어에서 데이터 검색 (0) | 2023.01.03 |
---|---|
pip을 사용하여 모든 Python 패키지를 업그레이드하는 방법 (0) | 2023.01.03 |
PHP 특성 - 일반 상수 정의 (0) | 2023.01.03 |
range(start, end)에 end가 포함되지 않는 이유는 무엇입니까? (0) | 2023.01.03 |
올바른 JSON 날짜 형식은 무엇입니까? (0) | 2023.01.03 |