web-dev-qa-db-ja.com

書き込み可能なストリームを実装する方法

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

独自のカスタム書き込み可能ストリームに対してどのメソッドを実装する必要がありますか、ドキュメントは「オン」ではなく「書き込み」を実装する必要があることを示しているようです

52
MonkeyBonkey

独自の書き込み可能なストリームを作成するには、3つの方法があります。

独自のクラスを作成する

このためには、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);
_

Simplified Constructor 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();
  }
}
_
110
Paul Mougel

実際、書き込み可能なストリームを作成するのは非常に簡単です。次に例を示します。

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が適切な回答を提供します。

10
TonyAdo