2014-01-31 3 views
33

Я хочу передать данные из потока амазонных кинезий в журнал 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' and not 'on'

ответ

80

Чтобы создать собственный поток, доступный для записи, у вас есть три возможности.

Создайте свой собственный класс

Для этого вам необходимо: 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

Вместо того, чтобы определить новый тип объекта, вы можете создании экземпляра пустой 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, вы можете использовать simplified constructor API:

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

Используйте класс ES6 в Node 4+

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

для поддержки режима объекта заменить 'chunk.toString()' per 'chunk.toString? chunk.toString(): chunk' – Gab

+0

Что делает эта строка: «util.inherits (EchoStream, stream.Writable); // шаг 1 "? –

+0

Это делает «EchoStream» «подклассом» 'stream.Writable': его методы прототипа унаследованы от него, а' stream.Writable' доступен с использованием свойства 'super_'. Дополнительную информацию см. В [документации] (https://nodejs.org/docs/latest/api/util.html#util_util_inherits_constructor_superconstructor). –

6

На самом деле, чтобы создать записываемый поток довольно прост. Вот это пример:

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 дать хороший ответ.

+0

Не менее ли легко создать читаемый поток? – Michael

+0

Невозможно прочитать свойство 'length' undefined ... в buf.length в определении функции ws.write – shrutim

Смежные вопросы