我正在使用一个库,ya-csv,它需要文件或流作为输入,但是我有一个字符串。
在Node中,如何将该字符串转换为流?
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();
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)
- pathikritstream.Readable
实例即可。 - Sukimastream.Readable
还不存在 (可以在https://web.archive.org/web/20121007204945/http://nodejs.org/api/stream.html查看)。 - icktoofay