Я изучаю код из документа модуля узла Node.js https://nodejs.org/api/http.html#http_event_connect_1. Исходный код печатает данные ответа HTTP на экране. После того, как я переместил обратный вызов события «данные» с места (A) на (B), он печатает только заголовки соединений HTTP/1.1 200 Connection Established ...
, но не имеет http. Программа просто останавливается там. Разве это сокет не испускает «данные» или какую причину? Кажется, что сокет не генерирует событие «конец».Узел Nodejs http.ClientRequest не работает с событием 'data' (приостановленный/текущий режим?)
Я исправил проблему, добавив код (C), заставляя сокет работать в поточном режиме. Но я не понимаю, почему это не работает без кода (C).
Клиентская часть кода выглядит следующим образом:
// make a request to a tunneling proxy
var options = {
port: 1337,
hostname: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80'
};
var req = http.request(options);
req.end();
req.on('socket', function(res, socket, head) { // Added for learning
socket.on('data', function(chunk) { // (B)
console.log(chunk.toString());
});
// socket.resume(); // (C) FIX
});
req.on('connect', function(res, socket, head) {
console.log('got connected!');
// make a request over an HTTP tunnel
socket.write('GET/HTTP/1.1\r\n' +
'Host: www.google.com:80\r\n' +
'Connection: close\r\n' +
'\r\n');
// socket.on('data', function(chunk) { // (A)
// console.log(chunk.toString());
// });
socket.on('end', function() {
proxy.close();
});
});
Полный и первоначально код здесь: https://nodejs.org/api/http.html#http_event_connect_1
Спасибо! Я не буду использовать API старого потока. Просто для удовольствия, я хочу выяснить, когда сокет приостановился. Я прочитал «Справочник по потоку», и я копаю в источнике node.js (net module и stream module), но я не могу найти, где он приостанавливает сокет. Вы бы указали источник или ссылку (с номером строки источника)? И если я хочу отладить такую проблему, как сделать отладку? – landon
Мне никогда не приходилось идти в source.js, поэтому я не знаю, где искать логику, которая приостанавливает ваш поток (возможно, даже на уровне C++). Чтобы отладить его, вы можете использовать узел-инспектор. Вы можете установить точки останова в обоих обратных вызовах и посмотреть, какой из них срабатывает первым, и что происходит, когда вызываются определенные методы потока. Кстати, я действительно не запускал ваш код. Я просто предположил, что может быть причиной, предоставил ваш код и объяснение. – sergeyz