javascript - Node 中的请求流在被消费之前会发生什么?

标签 javascript node.js express

我正在开发一个 Node 应用程序,在该应用程序中,我将发布请求的主体通过管道传输到可写流中,从而将数据保存到磁盘。我在构建此应用程序时意识到,我不知道请求流在被使用之前实际发生了什么。假设我做了这样的事情:

app.post('/api/data', (req, res) => {
  const writableStream = fs.createWriteStream('data.txt');
  setTimeout(() => {
    req.pipe(writableStream);
  }, 3000);
});

在最初收到请求和流开始通过管道传输之间的 3 秒内,流实际上发生了什么?是否正在加载到内存中?

最佳答案

Streams 支持传入数据的缓冲区,但是当缓冲区填满时,它们会告诉发送方停止发送更多数据,直到它们准备好接收更多数据。

由于传入的请求实际上是一个 TCP 连接,而传入的数据是到达 TCP 连接的数据,这可能会变成一个问题,即当您读取数据的速度不如预期时,传入的 TCP 数据会发生什么到达。答案是 TCP 支持流/控制,其中接收方告诉发送方暂时停止发送数据,然后当传入缓冲区清除时,它告诉发送方它可以再次开始发送数据。

这是一个 quick overview TCP流量控制。

在您的特定流编码示例中,在您发出 req.pipe() 之前,流上没有数据监听器,因此它与传入数据无关。因此,它将从传入的 TCP 流中填充缓冲区,停止从传入的 TCP 套接字中读取更多内容(这将触发 TCP 流控制)。然后,当您运行自动为 data 事件注册处理程序的 req.pipe() 时,流将开始触发这些事件。当数据从流缓冲区中读出时,它将能够接受更多来自 TCP 套接字的传入数据,这将允许 TCP 告诉 TCP 套接字的另一端重新启动新数据的传入流等。

这里有很多关于可读流如何工作的内容:http://www.sitepoint.com/basics-node-js-streams/以及如何暂停或恢复它们。

关于javascript - Node 中的请求流在被消费之前会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36141487/

相关文章:

javascript - 如何阻止指定容器之外的所有内容的所有输入?

node.js - NPM集群模块并监听不同端口

node.js - Nodemon安装错误问题

node.js - Node https ssl 你的连接不是私有(private)错误

mysql - 将数据插入表时出现 tafal 错误后无法对查询进行排队

node.js - pm2 启动npm -- 启动报错

javascript - 倒计时结束后刷新页面

javascript - 获取 Dynamics NAV 中文件的文件夹路径,而不使用 FileManagement.OpenFolderDialog

node.js - 对客户端进行响应前的Express中间件

javascript - Chrome浏览器控制台全局变量