web-dev-qa-db-fra.com

Comment implémenter un flux inscriptible

Je souhaite transférer des données d'un flux Amazon kinesis vers un journal s3 ou un journal bunyan.

L'exemple fonctionne avec un flux d'écriture de fichier ou une sortie standard. Comment pourrais-je implémenter mon propre flux inscriptible?

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

cela ne fonctionne pas en disant qu'il n'a pas de méthode "on"

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

quelles méthodes dois-je implémenter pour mon propre flux inscriptible personnalisé, les documents semblent indiquer que j'ai besoin d'implémenter "écriture" et non "sur"

52
MonkeyBonkey

Pour créer votre propre flux inscriptible, vous avez trois possibilités.

Créez votre propre classe

Pour cela, vous aurez besoin 1) d'étendre la classe Writable 2) d'appeler le constructeur Writable dans votre propre constructeur 3) de définir une méthode _write() dans le prototype de votre objet stream.

Voici un exemple:

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

Étendre un objet inscriptible vide

Au lieu de définir un nouveau type d'objet, vous pouvez instancier un objet Writable vide et implémenter la méthode _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);

Utilisez l'API du constructeur simplifié

Si vous utilisez io.js, vous pouvez utiliser API constructeur simplifiée :

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

Utilisez une classe ES6 dans Node 4+

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

En fait, créer un flux inscriptible est assez simple. Voici l'exemple:

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

Aussi, si vous voulez créer votre propre classe, @Paul donne une bonne réponse.

10
TonyAdo