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

267

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

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

12个回答

1
在NodeJS中,你可以通过几种方式创建可读流: 解决方案1 你可以使用fs模块。函数fs.createReadStream()允许你打开一个可读流,你只需要传入要开始流式处理的文件路径即可。
const fs = require('fs');

const readable_stream = fs.createReadStream('file_path');

解决方案2

如果您不想创建文件,可以创建一个内存流并对其进行操作(例如将其上传到某个地方)。您可以使用stream模块来实现这一点。您可以从stream模块导入Readable并创建一个可读流。在创建对象时,您还可以实现read()方法,该方法用于从内部缓冲区读取数据。如果没有可供读取的数据,则返回null。可选的size参数指定要读取的特定字节数。如果未指定size参数,则将返回内部缓冲区中包含的所有数据。

const Readable = require('stream').Readable;

const readable_stream = new Readable({
  ​read(size) {
   ​// ...
​  }
});

解决方案3

当您从网络获取某些内容时,可以像流一样获取(例如,您正在从某个API获取PDF文档)。

const axios = require('axios');

const readable_stream = await axios({
  method: 'get',
  url: "pdf_resource_url",
  responseType: 'stream'
}).data;

解决方案4

第三方软件包可以支持创建流的功能。通常使用 aws-sdk 软件包上传文件到 S3 的方式就是一种创建流的方法。

const file = await s3.getObject(params).createReadStream();

4
这些解决方案说明了创建流的各种方法,但没有回答问题,即如何将字符串转换为流。 - cjol
也许吧,但它仍然帮助我解决了自己的(类似的)问题。 - raarts

0

JavaScript是鸭子类型的,因此如果您只是复制可读流API,它将正常工作。实际上,您可能不需要实现大多数这些方法,或者只需将它们留作存根;您只需要实现库使用的内容即可。您还可以使用Node的预构建{{link2:EventEmitter类}}来处理事件,因此您不必自己实现addListener等。

以下是如何在CoffeeScript中实现它:

class StringStream extends require('events').EventEmitter
  constructor: (@string) -> super()

  readable: true
  writable: false

  setEncoding: -> throw 'not implemented'
  pause: ->    # nothing to do
  resume: ->   # nothing to do
  destroy: ->  # nothing to do
  pipe: -> throw 'not implemented'

  send: ->
    @emit 'data', @string
    @emit 'end'

然后你可以这样使用它:

stream = new StringStream someString
doSomethingWith stream
stream.send()

当我像这样使用 new StringStream(str).send() 时,会出现以下错误:TypeError: string is not a function at String.CALL_NON_FUNCTION (native) - pathikrit
仅仅因为JavaScript使用鸭子类型并不意味着你应该重新发明轮子。Node已经为流提供了实现。只需像@Garth Kidd建议的那样创建一个新的stream.Readable实例即可。 - Sukima
5
当我回答这个问题时,stream.Readable还不存在 (可以在https://web.archive.org/web/20121007204945/http://nodejs.org/api/stream.html查看)。 - icktoofay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接