【问题标题】:What will nodejs http module do when "on data" event listener is not set?未设置“on data”事件侦听器时,nodejs http 模块会做什么?
【发布时间】:2019-06-18 23:49:09
【问题描述】:
'use strict';

const http = require('http');
const fs = require('fs');

http.createServer((req, res) => {
  (async () => {
    await (new Promise((resolve, reject) => setTimeout(resolve, 10000)));
    console.log('recv...');
    req.setEncoding('utf8');
    req.on('data', (chunk) => {
      fs.writeFileSync('test.txt', chunk, { flag: 'a' });
    });
    req.on('end', () => {
      res.end();
    });
  })();
}).listen(23380, '0.0.0.0');

当未设置“on data”事件监听器时,nodejs http 模块(或一般的 http 协议)会做什么?

扔掉包裹(会不会丢包裹)?

或者将包存储在内存中(它会吃掉我所有的内存)吗?

或者告诉客户“嘿,我不想要你的包裹。稍后再寄给我”?

它是如何工作的?

如果您能提供一些参考资料(源代码或文档),我将不胜感激。

【问题讨论】:

    标签: node.js http tcp


    【解决方案1】:

    在阅读源代码一个下午后,我想我找到了问题的答案。

    http服务器会先接收数据。

    但是当数据池中的数据到达水印线时,它会暂停 socket,正如https://github.com/nodejs/node/blob/master/lib/_http_server.js:366所说,代码在https://github.com/nodejs/node/blob/master/lib/_http_server.js:636。

    暂停套接字意味着服务器将告诉客户端“不要向我发送更多数据”。我在Wireshark中发现“tcp window full”,我认为它是由服务器发送的,因为暂停。

    暂停套接字也意味着它不会不会导致内存爆炸,也不会不会丢失数据。 (数据仍存储在客户端中

    在设置事件监听器时,流将被恢复。代码在https://github.com/nodejs/node/blob/master/lib/_stream_readable.js:826。

    处理继续。

    【讨论】:

      【解决方案2】:

      http.createServer 实际上提供的是一个 EventEmitter Source。因此,您的问题可以简化为询问未收听的事件会发生什么。

      对于一个事件,无论谁侦听该特定事件,如果满足它发生的条件,它就会发生。因此,如果 "data" 事件是由 http.createServer 提供的 EventEmitter 发出的,您不能通过不监听它来阻止它。你实际上在做的只是忽略它。

      当您收听 data 对象时,您实际上是在使用 req.on 将新的 Listener 添加到该特定对象 (Source) 的侦听器数组中 动作。因此,如果您尚未订阅该事件,它将根本不会交付给您,仅此而已。它将如何影响代码取决于代码是否可以在没有事件的情况下做任何事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 2018-09-04
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 2011-03-31
        • 1970-01-01
        相关资源
        最近更新 更多