如何在Node.Js中从字符串创建流?

我正在使用一个库ya-csv,它需要一个文件或一个流作为输入,但我有一个字符串。

如何将该字符串转换为 Node 中的流?


答案 1

正如@substack在#node中纠正我的那样,Node v10中的新流API使这更容易:

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

...之后,您可以自由地将其管道化或以其他方式传递给预期的消费者。

它不像简历单行代码那样干净,但它确实避免了额外的依赖性。

(更新:到目前为止,在 v0.10.26 到 v9.2.1 中,如果未设置 ,则直接从 REPL 提示符调用将崩溃,但会出现异常。它不会在函数或脚本中崩溃。如果不一致使您紧张,请包括 .)pushnot implemented_readnoop


答案 2

不要使用Jo Liss的简历答案。它在大多数情况下都可以工作,但在我的情况下,它让我失去了一个很好的4或5个小时的错误发现。无需第三方模块即可执行此操作。

新答案

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

这应该是完全兼容的可读流。有关如何正确使用流的详细信息,请参阅此处

旧答案:只需使用本机直通流:

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

请注意,不会发出“close”事件(流接口不需要)。