节点中的请求stream在被使用之前会发生什么?

我正在处理一个节点应用程序,在这个应用程序中,我将一个post请求的主体转换为一个可写入的stream,将数据保存到磁盘。 我意识到,构build这个应用程序时,我不知道在请求stream被消耗之前究竟发生了什么。 说我做了这样的事情:

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

实际发生在最初接收请求和开始传送stream之间的3秒内的stream中发生了什么? 它被加载到内存中吗?

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

由于传入的请求实际上是一个TCP连接,并且传入的数据是到达TCP连接的数据,这可能会变成一个更多的问题,即当您没有按照要到达的速度读​​取数据时,传入的TCP数据会发生什么情况。 答案是TCP支持stream量/控制,接收者告诉发送者暂时停止发送数据,然后当接收缓冲区清除时,告诉发送者它可以再次开始发送数据。

以下是TCPstream量控制的简要概述 。

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

这里还有很多关于可读stream如何工作的地方: http : //www.sitepoint.com/basics-node-js-streams/以及如何暂停或恢复。