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);
独自のカスタム書き込み可能ストリームに対してどのメソッドを実装する必要がありますか、ドキュメントは「オン」ではなく「書き込み」を実装する必要があることを示しているようです
独自の書き込み可能なストリームを作成するには、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);
_
Io.jsを使用している場合は、 簡易コンストラクターAPI を使用できます。
_var writable = new stream.Writable({
write: function(chunk, encoding, next) {
console.log(chunk.toString());
next();
}
});
_
_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が適切な回答を提供します。