programing

쓰기 가능한 스트림을 구현하는 방법

nicescript 2021. 1. 18. 07:40
반응형

쓰기 가능한 스트림을 구현하는 방법


Amazon Kinesis 스트림의 데이터를 s3 로그 또는 Bunyan 로그로 파이프하고 싶습니다.

샘플은 파일 쓰기 스트림 또는 표준 출력과 함께 작동합니다. 내 쓰기 가능한 스트림을 어떻게 단순화합니까?

//this works
var file = fs.createWriteStream('my.log')
kinesisSource.pipe(file)

이것은 'on'메소드가 없다고 말하면 작동하지 않습니다.

var stream = {}; //process.stdout works however
stream.writable = true;
stream.write =function(data){
    console.log(data);
};
kinesisSource.pipe(stream);

내 사용자 정의 쓰기 가능한 스트림에 대해 구현해야하는 메서드는 문서에 'on'이 아닌 'write'를 구현해야 함을 나타내는 것 같습니다.


자신 만의 쓰기 가능한 스트림을 만들려면 세 가지 가능성이 있습니다.

나만의 수업 만들기

이를 위해서는 1) Writable 클래스를 확장하기 위해 2) 자체 생성자에서 Writable 생성자를 호출하기 위해 3) _write()스트림 객체의 프로토 타입에 메서드를 정의 해야합니다.

예를 들면 다음과 같습니다.

var stream = require('stream');
var util = require('util');

function EchoStream () { // step 2
  stream.Writable.call(this);
};
util.inherits(EchoStream, stream.Writable); // step 1
EchoStream.prototype._write = function (chunk, encoding, done) { // step 3
  console.log(chunk.toString());
  done();
}

var myStream = new EchoStream(); // instanciate your brand new stream
process.stdin.pipe(myStream);

빈 쓰기 가능 개체 확장

새 개체 유형을 정의하는 대신 빈 Writable개체를 인스턴스화 하고 _write()메서드를 구현할 수 있습니다 .

var stream = require('stream');
var echoStream = new stream.Writable();
echoStream._write = function (chunk, encoding, done) {
  console.log(chunk.toString());
  done();
};

process.stdin.pipe(echoStream);

단순화 된 생성자 API 사용

io.js를 사용하는 경우 단순화 된 생성자 API를 사용할 수 있습니다 .

var writable = new stream.Writable({
  write: function(chunk, encoding, next) {
    console.log(chunk.toString());
    next();
  }
});

Node 4+에서 ES6 클래스 사용

class EchoStream extends stream.Writable {
  _write(chunk, enc, next) {
    console.log(chunk.toString());
    next();
  }
}

실제로 쓰기 가능한 스트림을 만드는 것은 매우 간단합니다. 다음은 그 예입니다.

var fs = require('fs');
var Stream = require('stream');

var ws = new Stream;
ws.writable = true;
ws.bytes = 0;

ws.write = function(buf) {
   ws.bytes += buf.length;
}

ws.end = function(buf) {
   if(arguments.length) ws.write(buf);
   ws.writable = false;

   console.log('bytes length: ' + ws.bytes);
}

fs.createReadStream('file path').pipe(ws);

또한 자신만의 수업을 만들고 싶다면 @Paul이 좋은 대답을 제공합니다.

참조 URL : https://stackoverflow.com/questions/21491567/how-to-implement-a-writable-stream

반응형