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"
Pour créer votre propre flux inscriptible, vous avez trois possibilités.
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);
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);
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();
}
});
class EchoStream extends stream.Writable {
_write(chunk, enc, next) {
console.log(chunk.toString());
next();
}
}
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.