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
, он изменяет поток в потоковый режим и начинает потреблять данные.
Пожалуйста, проверьте эту ссылку для получения дополнительной информации об этом.