2015-10-28 1 views
0

Я изучаю код из документа модуля узла 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

ответ

0

Я считаю, что причина, почему (A) работает и (В) не есть потому что (A) назначил слушателю событие данных после того, как вы написали в сокет. Когда (B) назначает прослушиватель для события данных, это происходит до вызова socket.write. Когда socket.write называется, он приостанавливает сокет, поэтому socket.resume() возобновляет режим чтения данных. Я рекомендую вам использовать новый API потока, поскольку он намного интуитивен и гибкий (https://github.com/substack/stream-handbook).

Надеюсь, что это поможет.

+0

Спасибо! Я не буду использовать API старого потока. Просто для удовольствия, я хочу выяснить, когда сокет приостановился. Я прочитал «Справочник по потоку», и я копаю в источнике node.js (net module и stream module), но я не могу найти, где он приостанавливает сокет. Вы бы указали источник или ссылку (с номером строки источника)? И если я хочу отладить такую ​​проблему, как сделать отладку? – landon

+0

Мне никогда не приходилось идти в source.js, поэтому я не знаю, где искать логику, которая приостанавливает ваш поток (возможно, даже на уровне C++). Чтобы отладить его, вы можете использовать узел-инспектор. Вы можете установить точки останова в обоих обратных вызовах и посмотреть, какой из них срабатывает первым, и что происходит, когда вызываются определенные методы потока. Кстати, я действительно не запускал ваш код. Я просто предположил, что может быть причиной, предоставил ваш код и объяснение. – sergeyz

Смежные вопросы