javascript - variable - work with stream nodejs




Como criar streams de string em Node.Js? (6)

Eu estou usando uma biblioteca, ya-csv , que espera um arquivo ou um fluxo como entrada, mas eu tenho uma seqüência de caracteres.

Como converto essa string em um fluxo no Node?


Basta criar uma nova instância do módulo de stream e personalizá-lo de acordo com suas necessidades:

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

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

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

Como @substack me corrigiu em #node , a nova API de fluxos no Node v10 torna isso mais fácil:

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

… Após o qual você pode pipe lo livremente ou passá-lo para o consumidor pretendido.

Não é tão limpo quanto o one-liner do resumer , mas evita a dependência extra.

( Atualização: na v0.10.26 até v9.2.1 até o momento, uma chamada para push diretamente do prompt REPL irá travar com uma exceção not implemented se você não tiver definido _read . Não irá travar dentro de uma função ou script. Se a inconsistência o deixar nervoso, inclua o noop .)



Não use a resposta do residente de Jo Liss. Ele funcionará na maioria dos casos, mas no meu caso ele me perdeu umas boas 4 ou 5 horas. Não há necessidade de módulos de terceiros para fazer isso.

RESPOSTA NOVA :

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

Este deve ser um fluxo legível totalmente compatível. Veja aqui para mais informações sobre como usar fluxos corretamente.

RESPOSTA ANTIGA : Apenas use o fluxo PassThrough nativo:

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

Observe que o evento 'close' não é emitido (o que não é exigido pelas interfaces de fluxo).


Outra solução é passar a função read para o construtor de Readable (cf. opções legíveis por fluxo de doc)

var s = new Readable({read(size) {
    this.push("your string here")
    this.push(null)
  }});

você pode depois de usar s.pipe por exemplo


em café-script:

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

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

use-o:

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




inputstream