标签: node-streams

Node.js 流转换是否保持块的顺序?

我看到 Node.js Stream API 中的转换流使用异步函数在块到达时对其进行转换: https ://nodejs.org/api/stream.html#stream_transform_transform_chunk_encoding_callback

转换流是否按照块到达的顺序发送块?因为对于异步函数,情况并非如此。

javascript asynchronous node.js node-streams

3
推荐指数
1
解决办法
1341
查看次数

如何从字符串创建文件并通过 FormData 发送

我有一个字符串形式的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 收到错误。

问题是如何获得与第一种方法相同的结果,而不将本地文件写入磁盘。

提前致谢!

buffer fs node.js node-streams

3
推荐指数
1
解决办法
3034
查看次数

如何克隆 NodeJS 流?

我需要以某种方式readstream在nodeJS中克隆a。也就是说,如果我有一个,readStream我需要它的两个副本stream1、stream2。我可以在其中读取流stream1stream2单独读取。我怎样才能做到这一点,因为据我所知,即使我尝试将原始流传输readStreamstream1,您也无法轻松复制流,stream2我无法单独使用它们中的每一个

javascript chunks node.js node-streams

3
推荐指数
1
解决办法
976
查看次数

如何防止结束消息关闭 Nodejs 流?

在 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 结束。我不能过早地切换流。

node.js node-streams

2
推荐指数
1
解决办法
796
查看次数

使用流而不是`fetch()`有什么好处?

我试图使用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会冻结应用程序吗?还有其他差异吗?

javascript fetch node.js onedrive node-streams

1
推荐指数
1
解决办法
375
查看次数

如何使用 Node.js writeStream 将 JSON 数组写入文件?

我编写了一个 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)

我怎样才能将数组实际附加到输出中而不是链接它们?它甚至可行吗?

javascript json fs node.js node-streams

1
推荐指数
1
解决办法
8487
查看次数

仅当收到 HTTP 200 时如何通过管道()npm-request?

我有以下代码:

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 请求?应该可以一口气搞定!

javascript node.js npm-request node-streams

1
推荐指数
1
解决办法
2382
查看次数