Подтвердить что ты не робот

Node.js process.nextTick error

Я испытываю что-то странное с node.js:

Когда я пытаюсь использовать клиент http с только следующим кодом:

require('http').get({host:'127.0.0.1',port:9000, path:'/'}, function(res){
    var data = '';
    res.setEncoding('utf8');
    res.on('data', function(chunk){
        data += chunk; 
    });
    res.on('end', function(){
        console.log(data);
    });
});

Выдается ошибка:

node.js:116
        throw e; // process.nextTick error, or 'error' event on first tick
        ^ TypeError: Cannot call method 'emit' of undefined
    at Socket.<anonymous> (http.js:1174:9)
    at Socket.emit (events.js:42:17)
    at Array.<anonymous> (net.js:799:27)
    at EventEmitter._tickCallback (node.js:108:26)

Когда я просматриваю 127.0.0.1:9000 в своем браузере, я получаю желаемую веб-страницу. Кроме того, в журналах веб-хоста я вижу, что было успешное соединение (что-то не происходит, если я использую, скажем, localhost вместо 127.0.0.1).

Я говорю это смешно, потому что если я изменю хост на google или что-то не работает, и он выталкивает html на консоль.

Я должен отметить, что я запускаю node 0.4.2 под cygwin, построенный из исходного кода.

Кто-нибудь видел/рассматривал это раньше?

4b9b3361

Ответ 1

Я уверен, что выяснил, что вызывает эту ошибку:

Если нет Content-Length HTTP заголовок.

Есть случаи, когда этот заголовок игнорируется, особенно когда Transfer-Encoding: chunked установлен, а затем node играет хорошо. Тем не менее, для базового доступа с node передача кодирования часто не может быть настроена на то, что хостинг-сервер не является потоковым материалом, но часто не устанавливает заголовок Content-Length (независимо от того, соответствует ли это стандартное соответствие сомнительный, стандарт говорит, что, если он не запрещен другими правилами, этот заголовок ДОЛЖЕН быть установлен, хотя это реальные случаи, с которыми нужно иметь дело в любом случае).

Я проверил это со своим собственным локальным хостом, и когда я установил Content-Length, node неожиданно играет хорошо.

Как упоминал @dhofstet в комментариях (и в выпуске), он нашел URL-адрес, который также нарушает node: www.cnbc.com/id/41863659/
Когда он разместил это, я проверил, и он действительно сломал http.get(). Я перепробовал сейчас, и во время написания url теперь выпускает заголовок Content-Length, а чудо чудес, node больше не сбой на этом URL-адресе.

Было бы неплохо, если бы кто-то смог подтвердить это (не нужно слишком долго устанавливать локальный сервер, если у вас его еще нет, и выставлять основной ответ с настраиваемыми заголовками).

Ответ 2

вы можете обновить node с помощью

$sudo n stable

У меня есть эта проблема с обычным явлением и решаю, обновив node