Estou usando uma biblioteca, ya-csv , que espera um arquivo ou um fluxo como entrada, mas tenho uma string.
Como faço para converter essa string em um fluxo no nó?
fonte
Estou usando uma biblioteca, ya-csv , que espera um arquivo ou um fluxo como entrada, mas tenho uma string.
Como faço para converter essa string em um fluxo no nó?
No nó 10.17, stream.Readable possui um from
método para criar facilmente fluxos a partir de qualquer iterável (que inclui literais de matriz):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
Observe que pelo menos entre 10.17 e 12.3, uma sequência é iterável, portanto Readable.from("input string")
funcionará, mas emitirá um evento por caractere. Readable.from(["input string"])
emitirá um evento por item na matriz (nesse caso, um item).
Observe também que nos nós posteriores (provavelmente 12.3, já que a documentação diz que a função foi alterada), não é mais necessário agrupar a sequência em uma matriz.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
Como o @substack me corrigiu no #node , a nova API de fluxos no nó v10 facilita isso:
… Após o qual você pode canalizá- lo ou passá-lo livremente para o consumidor pretendido.
Não é tão limpo quanto o one-liner do resumerador , mas evita a dependência extra.
( Atualização: das v0.10.26 à v9.2.1 até agora, uma chamada para
push
diretamente do prompt REPL falhará com umanot implemented
exceção se você não tiver definido_read
. Não falhará dentro de uma função ou script. Se a inconsistência o fizer nervoso, inclua onoop
.)fonte
_read
método para buscar dados do recurso subjacente".null
o buffer do fluxo?null
diz ao stream que terminou de ler todos os dados e fecháreadable.push()
método deve ser chamado apenas pelos implementadores legíveis e somente de dentro doreadable._read()
método".Não use a resposta de Jo Liss. Funcionará na maioria dos casos, mas no meu caso, perdi uma boa localização de bug de 4 ou 5 horas. Não há necessidade de módulos de terceiros para fazer isso.
NOVA RESPOSTA :
Este deve ser um fluxo legível totalmente compatível. Veja aqui para mais informações sobre como usar fluxos corretamente.
RESPOSTA ANTIGA : Basta usar o fluxo PassThrough nativo:
Observe que o evento 'close' não é emitido (o que não é requerido pelas interfaces de fluxo).
fonte
Basta criar uma nova instância do
stream
módulo e personalizá-lo de acordo com suas necessidades:ou
fonte
pipe()
deve retornar o fluxo de destino, pelo menos.Edit: A resposta de Garth é provavelmente melhor.
Meu texto de resposta antigo é preservado abaixo.
Para converter uma string para um fluxo, você pode usar uma pausa através de stream:
Exemplo:
fonte
resumer
funcionou muito bem. Obrigado!Existe um módulo para isso: https://www.npmjs.com/package/string-to-stream
fonte
no roteiro do café:
use-o:
fonte
Outra solução é passar a função de leitura para o construtor de Readable ( opções legíveis do fluxo de documentos do cf )
após o uso do s.pipe, por exemplo,
fonte
Eu cansei de ter que reaprender isso a cada seis meses, então acabei de publicar um módulo npm para abstrair os detalhes da implementação:
https://www.npmjs.com/package/streamify-string
Este é o núcleo do módulo:
str
é ostring
que deve ser passado para o construtor na invocação e será gerado pelo fluxo como dados.options
são as opções típicas que podem ser passadas para um fluxo, de acordo com a documentação .De acordo com o Travis CI, ele deve ser compatível com a maioria das versões do nó.
fonte
Aqui está uma solução organizada no TypeScript:
fonte
O JavaScript é do tipo pato, portanto, se você apenas copiar a API de um fluxo legível , ele funcionará bem. De fato, você provavelmente não pode implementar a maioria desses métodos ou apenas deixá-los como stubs; tudo o que você precisa implementar é o que a biblioteca usa. Você pode usar a
EventEmitter
classe pré-criada do Node para lidar com eventos também, para que você não precise implementaraddListener
isso.Veja como você pode implementá-lo no CoffeeScript:
Então você pode usá-lo assim:
fonte
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
quando eu usá-lo comonew StringStream(str).send()
stream.Readable
como a sugerida por @Garth Kidd.stream.Readable
não existia quando escrevi esta resposta.