Node.js ответ от http-запроса, не вызывающего событие "end" без включения события "данные"

Итак, у меня есть простое клиентское приложение, взаимодействующее с приложением на стороне сервера в node.js. На стороне клиента у меня есть следующий код:

function send (name) {
    http.request({
        host: '127.0.0.1',
        port: 3000,
        url: '/',
        method: 'POST'
    }, function (response) {
        response.setEncoding('utf8');
        response.on('data', function (data) {
           console.log('did get data: ' + data);
        });
        response.on('end', function () {
            console.log('\n   \033[90m request complete!\033[39m');
            process.stdout.write('\n your name: ');
        });
        response.on('error', function (error) {
            console.log('\n Error received: ' + error);
        });
    }).end(query.stringify({ name: name})); //This posts the data to the request
}

Нечетная часть, если я не включаю событие data, через:

    response.on('data', function (data) {
       console.log('did get data: ' + data);
    });

Событие "конец" для ответа никогда не запускается.

Код сервера выглядит следующим образом:

var query = require('querystring');
require('http').createServer(function (request, response) {
    var body = '';
    request.on('data', function (data) {
       body += data;
    });
    request.on('end', function () {
        response.writeHead(200);
        response.end('Done');
        console.log('\n got name \033[90m' + query.parse(body).name + '\033[39m\n');
    });
}).listen(3000);

Я хотел бы знать, почему это происходит, когда документация (насколько мне известно) не требует, чтобы вы прослушивали событие данных, чтобы закрыть сеанс ответа.

Ответы

Ответ 1

'end' вызывается только тогда, когда все данные были использованы, проверьте приведенную ниже ссылку:

Событие: "конец"

Это событие срабатывает, когда больше данных не будет предоставлено.

Обратите внимание, что конечное событие не будет срабатывать, если данные не будут полностью потребляются. Это можно сделать, переключившись в режим течения или вызывая функцию read(), пока вы не дойдете до конца.

Но зачем вам звонить .on('data',..)? Ответ

Если вы присоедините прослушиватель событий данных, то он переключит поток в поток, и данные будут переданы вашему обработчику, как только он доступен.

Таким образом, в основном, добавляя слушателя data, он изменяет поток в потоковый режим и начинает потреблять данные.

Пожалуйста, проверьте эту ссылку для получения дополнительной информации об этом.