Что будет делать http-модуль nodejs, если прослушиватель событий «on data» не установлен? - PullRequest
0 голосов
/ 25 января 2019
'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');

Что будет делать http-модуль nodejs (или в общем протоколе http), когда прослушиватель событий «on data» не установлен?

Выбрасывать пакеты (Будет ли он терять пакеты)?

Или хранить пакеты в памяти (будет ли она поглощать всю мою память)?

Или сказать клиенту: «Эй, я не хочу, чтобы ваши пакеты. Отправьте мне позже»?

Какэто работает?

Буду признателен, если вы сможете показать некоторые ссылки (исходный код или документацию).

Ответы [ 2 ]

0 голосов
/ 25 января 2019

После полудня в чтении исходного кода, я думаю, я нахожу ответ на вопрос.

http-сервер сначала получит данные.

Но когда данные в пуле данных достигают линии водяного знака, они приостанавливают сокет, как указано https://github.com/nodejs/node/blob/master/lib/_http_server.js: 366, а код имеет значение https://github.com/nodejs/node/blob/master/lib/_http_server.js: 636.

Приостановка сокета означает, что сервер скажет клиенту «Не присылайте мне больше данных». Я обнаружил «окно TCP заполнено» в Wireshark и думаю, что оно отправлено сервером из-за паузы.

Приостановка сокета также означает, что не вызовет взрыва памяти и не потеряет данные . (Данные все еще хранятся в клиенте )

При настройке прослушивателя событий поток будет возобновлен. Код: https://github.com/nodejs/node/blob/master/lib/_stream_readable.js: 826.

Обработка продолжается.

0 голосов
/ 25 января 2019

На самом деле http.createServer предоставляет EventEmitter Source .Поэтому ваш вопрос может быть упрощен до вопроса о том, что происходит с событиями, которые не были прослушаны.

Для события, независимо от того, кто слушает это конкретное событие, если условие выполнено для него, оно произойдет.Поэтому, если EventEmitter, предоставленный http.createServer, генерирует событие "data" , вы не можете остановить его, не перечисляя его.На самом деле вы просто игнорируете это.

Когда вы слушаете объект data , вы фактически добавляете нового слушателя в массив слушателей к этому конкретному объекту ( Source ), используя требование действие.Так что если вы не подписались на это событие, оно просто не будет доставлено вам и все.То, как это повлияет на код, зависит от того, сможет ли код обойтись без события и ничего более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...