问题标签 [node-streams]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
266 浏览

javascript - 流和事件循环 - 数据处理程序是否总是在下一个滴答时触发?

假设我有一个可读流,如下所示:

我的问题是,onData回调会在事件循环的下一个滴答声中触发吗?或者是否有可能onData在事件循环的同一滴答声中调用处理程序两次?

0 投票
1 回答
1273 浏览

node.js - node.js 如何处理带背压的快速生产者和慢速消费者

我是 node.js 的新手,不了解有关流的文档。希望能得到一些提示。

我正在读取一个非常大的文件行,然后对于每一行我都调用一个异步网络 api。

显然,本地文件的读取速度比异步调用完成的速度要快得多:

在“执行”方法中添加背压的方法是什么?

0 投票
1 回答
471 浏览

node.js - 无法让节点正确地将数据通过管道传输到下载文件

我对节点和流式传输相当陌生,尝试将大量数据流式传输到客户端浏览器上的文件时遇到问题。

因此,例如,如果在服务器上,如果我有一个大文件 test.txt,我可以通过设置标题附件并将文件传送到请求响应,轻松地将其流式传输到客户端浏览器,如下所示。

当用户单击按钮时,下载开始,我们看到数据流式传输到下载文件。流需要几分钟,但在此期间客户端不会被阻止,他们可以在浏览器下载文件时继续做其他事情。

但是我的数据没有存储在文件中,我需要从另一台服务器一次检索一个字符串。所以我试图创建自己的读取流并逐块推送我的数据,但是当我执行以下操作时它不起作用:

使用此代码,当用户请求下载时,一旦下载开始,客户端就会被阻止,并且在下载完成之前无法执行任何其他操作。此外,如果数据流传输的时间超过 30 秒,在这种情况下,我们会遇到服务器超时,并且下载失败。使用文件流,这不是问题

如何让它像文件流一样运行,并且在下载时不阻止客户端执行其他请求。任何有关实施此方法的最佳方法的建议将不胜感激。

0 投票
1 回答
5664 浏览

node.js - 为什么尝试写入大文件会导致js堆内存不足

这段代码

运行约 30 秒后给出此错误消息

而这段代码

几乎可以立即完美运行并生成一个 10MB 的文件。据我了解,流的意义在于两个版本应该在大约相同的时间内运行,因为数据是相同的。即使a每次迭代将 s 的数量增加到 100 或 1000 也几乎不会增加运行时间,并且写入一个 1GB 的文件也没有任何问题。在 1e6 次迭代中每次迭代写入一个字符也可以正常工作。

这里发生了什么?

0 投票
1 回答
397 浏览

c++ - 本地 C++ 插件 InputStream 的可读节点流

从概念上讲,我想做的事情非常简单。我在节点中有一个Readable流,我将它传递给一个本地 c++ 插件,我想将它连接到一个IInputStream.

我使用的本机库就像我见过的许多 c++(或 Java)流接口一样工作。该库提供了一个IInputStream接口(技术上是一个抽象类),我继承并覆盖了虚函数。看起来像这样:

在这些功能中,重要的是read. 本机库在需要更多数据时会调用此函数,并且该函数必须阻塞,直到它能够返回请求的数据(或流结束)。这是我的实现read

这个想法是,c++ 代码保持对节点流对象的引用。当本机代码要读取时,它必须与节点事件循环同步,然后尝试read在节点流上调用。如果节点流返回null,这表明数据还没有准备好,所以本机线程休眠,让节点事件循环线程有机会运行并填充其缓冲区。

该解决方案非常适用于单个流,甚至 2 或 3 个并行运行的流。然后由于某种原因,当我达到 4+ 个并行流的神奇数量时,这完全死锁了。没有一个流可以成功读取任何字节。上述循环无限运行,每次都while返回对节点流的调用。null

它表现得好像节点正在挨饿,并且流永远没有机会填充数据。但是,我尝试调整睡眠持续时间(更大的值和随机值),但没有效果。同样清楚的是,事件循环继续运行,因为我的 lambda 函数继续在那里执行(我printf在里面放了一些 s 来确认这一点)。

以防万一它可能是相关的(我不认为它是相关的),我还包括我的JsEventLoopSync. 这使用 libuv 来安排要在节点事件循环上执行的 lambda。它被设计成一次只能安排一个,其他调用必须等到第一个完成。

那么,我错过了什么?有没有更好的方法来等待节点线程有机会运行?是否有完全不同的设计模式可以更好地工作?节点是否对它一次可以处理的流数量有一些上限?

0 投票
1 回答
16 浏览

node.js - 仅当摘要通过时才传递流

我在 express.js 模块中有一个管道,我在其中获取一个文件,解密它,通过摘要传递它以确保它是有效的,然后如果摘要通过,则希望将其作为响应返回。代码看起来像这样:

问题是,一旦我将输出通过管道传输到res,无论摘要是否通过,它都会通过管道传输它。但是,如果我不将消化器的输出通过管道传输到任何东西,那么什么也不会发生 - 我猜右端没有压力来移动数据。

我可以简单地运行两次解密管道,实际上这是以前所做的,但我正在努力加快速度,所以一切只发生一次。我的一个想法是将摘要器输出通过管道传输到缓冲区,如果摘要匹配,则将缓冲区发送到res. 这将需要与文件大小成比例的内存,这在大多数情况下并不可怕。但是,我找不到太多关于如何.pipe()直接到缓冲区的信息。我能找到的最接近的东西是bl模块,但是在它演示管道到收集数据的函数的部分中,提到了这个警告:

请注意,当您像这样使用回调方法时,生成的数据参数是列表中所有 Buffer 对象的串联。如果您想避免这种连接的开销(在极端性能意识的情况下),那么请避免使用回调方法,而只听“end”,就像标准的 Stream。

我还不够熟悉,bl无法理解这对于效率的真正含义。具体来说,我不明白为什么它在谈论连接缓冲区对象 - 例如,为什么必须连接一个以上的缓冲区对象?)。我不确定如何遵循它的建议并且仍然有一个简单的管道。

0 投票
1 回答
31 浏览

javascript - 是否可以在不引用流的情况下取消管道对象

我有一个 ReadableStream 和一个 WriteableStream。在实例化两个对象后,我将可读流通过管道传输到可写流中。

有没有一种方法可以在不引用可读流的情况下取消流。

解决这个问题的通常方法当然是

但是在这种情况下,我不再有权访问可读对象,只能访问可写对象。我想做一些类似的事情

我需要这样做的原因是,在某些时候我不再需要可写对象,我需要将其从流中断开。我可以丢弃所有引用以便对其进行垃圾收集,但如果不取消管道,流将很高兴地继续永远消耗内存(流永远不会结束),并且由于流仍然保留引用,因此对象将永远不会被垃圾收集。

0 投票
1 回答
416 浏览

node.js - 使用文件元数据将节点请求流式传输到云

我使用 koa 来构建一个网络应用程序,并且我希望允许用户将文件上传到它。这些文件需要流式传输到云端,但我想避免将文件保存在本地。

问题是在将上传流传输到可写流之前,我需要一些文件元数据。我想拥有 mime 类型并可选择附加其他数据,如原始文件名等。

我尝试发送将请求的“content-type”标头设置为文件类型的二进制数据,但我希望请求具有内容类型application/octet-stream,以便我可以在后端知道如何处理请求。

我在某处读到更好的选择是使用multipart/form-data,但我不确定如何构造请求,以及如何解析元数据以便在我通过管道传输到其写入流之前通知云。

这是我当前使用的代码。基本上,它只是按原样管道请求,我使用请求标头来了解文件的类型:

请假设我对上传协议和管理流不太了解。

0 投票
1 回答
404 浏览

javascript - 如何使流从一个管道到另一个管道nodejs

我只是想了解节点流并尝试创建管道。所以读取一个文件并写入另一个可写流并再次传递给res因为那也是可写流。
但它会抛出错误

错误 [ERR_STREAM_CANNOT_PIPE]:无法管道,不可读

请让我知道失败的原因,并查看下面的英特尔代码。

0 投票
1 回答
3580 浏览

javascript - Node.js createReadStream 错误处理

我正在运行一个 SSR React node.js 服务器,我需要一些关于如何解决我的问题的建议。我的 node.js 服务器因未定义窗口等错误而崩溃/重新启动,而不仅仅是记录和打印 500 错误消息。

这是我的流:

我以为我的捕获会出现这些错误,但显然不是,有人可以帮我指出正确的方向吗?

更新:1我目前正在尝试: