我想将数据从亚马逊kinesis流传输到s3日志或bunyan日志。
该示例使用文件写入流或标准输出。我怎么会扼杀自己的可写流?
//this works
var file = fs.createWriteStream('my.log')
kinesisSource.pipe(file)
这并不能说它没有方法'
var stream = {}; //process.stdout works however
stream.writable = true;
stream.write =function(data){
console.log(data);
};
kinesisSource.pipe(stream);
我必须为我自己的自定义可写流实现哪些方法,文档似乎表明我需要实现' write'而不是'
答案 0 :(得分:104)
要创建自己的可写流,您有三种可能性。
为此,您需要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,则可以使用simplified constructor 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();
}
}
答案 1 :(得分:9)
实际上创建可写流非常简单。 这是一个例子:
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会给出一个很好的答案。