我看到 Node.js Stream API 中的转换流使用异步函数在块到达时对其进行转换: https ://nodejs.org/api/stream.html#stream_transform_transform_chunk_encoding_callback
转换流是否按照块到达的顺序发送块?因为对于异步函数,情况并非如此。
我有一个字符串形式的svg 。我想将该字符串转换为文件并将其发送FormData到另一个 API。
我找到了一种工作方式,但包括在本地创建一个文件(使用fs),然后readStream从刚刚创建的文件创建一个。处理许多文件的速度非常慢,并且大多数时候都会导致超时。
fs.writeFile('file.svg', svgString, async () => {
const fr = fs.createReadStream('file.svg');
const formData = new FormData();
formData.append('media', fr);
const response = await Axios.post(route, formData, {...}
});
});
Run Code Online (Sandbox Code Playgroud)
这是我使用 Buffer 和 Readable 的(失败的)方法:
// Create readable from svg string
const b = Buffer.from(svgString, 'utf-8');
const r = Readable.from(b);
const formData = new FormData();
formData.append('media', fr);
const response = await Axios.post(route, formData, {...});
Run Code Online (Sandbox Code Playgroud)
此方法给出的结果与第一种方法不同。然后我从外部 API 收到错误。
问题是如何获得与第一种方法相同的结果,而不将本地文件写入磁盘。
提前致谢!
我需要以某种方式readstream在nodeJS中克隆a。也就是说,如果我有一个,readStream我需要它的两个副本stream1、stream2。我可以在其中读取流stream1并stream2单独读取。我怎样才能做到这一点,因为据我所知,即使我尝试将原始流传输readStream到stream1,您也无法轻松复制流,stream2我无法单独使用它们中的每一个
在 Node 服务器中,我有一系列管道连接在一起的流。比如说:
streamA.pipe(streamB).pipe(streamC)
Run Code Online (Sandbox Code Playgroud)
最终 streamA 完成,此时我想将下游切换到另一个源:
streamD.pipe(streamB).pipe(streamC)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这样做时,我收到以下错误:
Error: write after end
Run Code Online (Sandbox Code Playgroud)
如何防止streamA关闭我的下游?或者我怎样才能打开我的下游备份以将它们切换到 streamD?
此外,我的用例要求我等到 streamA 结束。我不能过早地切换流。
我试图使用OneDrive JS SDK下载文件,所以我使用了Microsoft的代码:
// Download a file from OneDrive
let fs = require('fs'); // requires filesystem module
client
.api('/me/drive/root/children/Book.xlsx/content')
.getStream((err, downloadStream) => {
if (err) {
console.log(err);
return;
}
let writeStream = fs.createWriteStream('../Book1.xlsx');
downloadStream.pipe(writeStream).on('error', console.log);
});
Run Code Online (Sandbox Code Playgroud)
因为我想让它在浏览器中工作(不仅仅是在Node中),我首先尝试了一些用于浏览器的流lib但却无法正常工作.最后,我得到了它只使用REST API和fetch()(SDK是REST API的包装器).
一个简单fetch(url)的工作.所以我想知道,为什么MS在单行完成工作时会遇到上述所有流代码的麻烦?
特别是流的表现比某种方式更好fetch().例如,在下载大文件时,fetch会冻结应用程序吗?还有其他差异吗?
我编写了一个 Node.js 脚本来从网站上抓取数据,我在该网站上迭代页面以提取结构化数据。
我为每个页面提取的数据是对象数组的一种形式。
我认为我可以使用fs.createWriteStream()方法创建一个可写流,在每个页面提取后我可以在该流上增量写入数据。
显然,你只能将字符串或缓冲区写入流,所以我正在做这样的事情:
output.write(JSON.stringify(operations, null, 2));
Run Code Online (Sandbox Code Playgroud)
但最后,一旦我关闭流,JSON 就会格式错误,因为显然我只是一个接一个地附加每个页面的每个数组,结果看起来像这样:
[
{ ... }, /* data for page 1 */
{ ... }
][ /* => here is the problem */
{ ... }, /* data for page 2 */
{ ... }
]
Run Code Online (Sandbox Code Playgroud)
我怎样才能将数组实际附加到输出中而不是链接它们?它甚至可行吗?
我有以下代码:
let request = require('request');
let fs = require('fs');
request.get('http://localhost:8080/report.rtf')
.pipe(fs.createWriteStream(__dirname + '/savedDoc.rtf'));
Run Code Online (Sandbox Code Playgroud)
它运行良好,但前提是文档从给定的 URL 成功下载。但是,如果有任何 HTTP: 403、404 或任何其他错误,则会保存一个长度为零的空文件!
我怎么能.pipe()只在 HTTP: 200 响应的情况下而不使用任何额外的 HEAD 请求?应该可以一口气搞定!
node-streams ×7
node.js ×7
javascript ×5
fs ×2
asynchronous ×1
buffer ×1
chunks ×1
fetch ×1
json ×1
npm-request ×1
onedrive ×1