277 votes

Comment créer des flux à partir de chaîne dans Node.Js?

J'utilise une bibliothèque, ya-csv , qui attend un fichier ou un flux en entrée, mais j'ai une chaîne.

Comment convertir cette chaîne en un flux dans Node?

221voto

Garth Kidd Points 2792

Comme @substack m'a corrigé en #nœud, la nouvelle API de flux dans le Nœud v10 rend cela plus facile:

var s = new stream.Readable();
s._read = function noop() {}; // redundant? see update below
s.push('your text here');
s.push(null);

... après quoi vous pouvez librement pipe , il ou sinon de le passer à votre clientèle cible.

Ce n'est pas aussi propre que le resumer one-liner, mais il le fait d'éviter le supplément de dépendance.

(Mise à jour: dans v0.10.26, un appel à l' push directement à partir de la RÉPLICATION de l'invite de collision avec un not implemented d'exception si vous n'avez pas configuré _read. Il ne tombe pas en panne à l'intérieur d'une fonction ou d'un script. Si l'incohérence rend nerveux, comprennent l' noop.)

169voto

B T Points 4868

N'utilisez pas de Jo Liss de resumer réponse. Il fonctionne dans la plupart des cas, mais dans mon cas, il m'a perdu un bon 4 ou 5 heures de bugs. Il n'est pas nécessaire pour les modules tiers pour ce faire.

NOUVELLE RÉPONSE:

var Readable = require('stream').Readable

var s = new Readable
s.push('beep')    // the string you want
s.push(null)      // indicates end-of-file basically - the end of the stream

Ce doit être entièrement conforme Lisible flux. Voir ici pour plus d'informations sur la façon d'utiliser les flux correctement.

VIEILLE RÉPONSE: Utilisez simplement le natif de Relais de flux:

var stream = require("stream")
var a = new stream.PassThrough()
a.write("your string")
a.end()

a.pipe(process.stdout) // piping will work as normal
/*stream.on('data', function(x) {
   // using the 'data' event works too
   console.log('data '+x)
})*/
/*setTimeout(function() {
   // you can even pipe after the scheduler has had time to do other things
   a.pipe(process.stdout) 
},100)*/

a.on('end', function() {
    console.log('ended') // the end event will be called properly
})

Notez que le "proche" de l'événement n'est pas émis (ce qui n'est pas requis par le flux d'interfaces).

35voto

zemirco Points 5419

Créez simplement une nouvelle instance du module stream et personnalisez-la en fonction de vos besoins:

 var Stream = require('stream')
var stream = new Stream()

stream.pipe = function(dest) {
  dest.write('your string')
}

stream.pipe(process.stdout) // in this case the terminal, change to ya-csv
 

ou

 var Stream = require('stream')
var stream = new Stream()

stream.on('data', function(data) {
  process.stdout.write(data) // change process.stdout to ya-csv
})

stream.emit('data', 'this is my string')
 

12voto

Jo Liss Points 6692

Pour convertir une chaîne de caractères à un flux de données, vous pouvez utiliser une pause par le biais de flux:

through().pause().queue('your string').end()

Exemple:

var through = require('through')

// Create a paused stream and buffer some data into it:
var stream = through().pause().queue('your string').end()

// Pass stream around:
callback(null, stream)

// Now that a consumer has attached, remember to resume the stream:
stream.resume()

Mise à jour: @substack tout juste de publier un resumer du module. C'est comme une pause par le biais de() stream, mais auto-reprend le stream sur nextTick, le forum personne d'autre n'est en pause en attendant:

var resumer = require('resumer')

var stream = resumer().queue('your string').end()

// Now pass `stream` around. No need to resume, it happens automatically.

L' resumer().queue('some string').end() idiome est ma méthode préférée pour créer ad-hoc flux de maintenant. C'est beaucoup plus pratique car vous pouvez l' return ruisseaux, et ils aurons toujours repris.

6voto

xinthink Points 173

en café-script:

 class StringStream extends Readable
  constructor: (@str) ->
    super()

  _read: (size) ->
    @push @str
    @push null
 

utilise le:

 new StringStream('text here').pipe(stream1).pipe(stream2)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X