我正在开发一个 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/