2011-03-13 13 views
16

que estoy experimentando algo extraño con Node.js:Node.JS process.nextTick error

Cuando intento y el uso de un cliente HTTP sólo con el siguiente código:

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); 
    }); 
}); 

se emite un error :

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) 

Cuando navego a 127.0.0.1:9000 en mi navegador obtengo la página web deseada. Además, en los registros de host web puedo ver que ha habido una conexión exitosa (algo que no ocurre si uso, digamos, localhost en lugar de 127.0.0.1. Solo un comentario).

Digo que es gracioso porque si cambio el host a google o todo eso funciona bien y escupe el html en la consola.

Debo señalar, estoy ejecutando el nodo 0.4.2 en cygwin, construido desde la fuente.

¿Alguien ha visto/tratado esto antes?

+0

me encontré con el mismo problema hoy (con el nodo 0.4.2 en Arch Linux) cuando intento obtener el contenido de una url de cnbc.com, aunque lamentablemente no sé cómo arreglarlo (aún) ... – dhofstet

+0

@dhofstet, ¿es coherente con usted? ¿Puedes definir un caso reproducible? ¿Has notado algo diferente en los casos en que falla en casos normales? Esto es tan frustrante – davin

+0

Abrí un ticket para ello: https://github.com/joyent/node/issues/784 – dhofstet

Respuesta

8

Estoy bastante seguro de que he descubierto lo que hace que este error:

When there is no Content-Length HTTP header.

Hay circunstancias en que se ignora esta cabecera, específicamente cuando se establece Transfer-Encoding: chunked, y entonces el nodo juega limpio. Sin embargo, para la obtención básica con el nodo, la codificación de transferencia a menudo no se configurará como fragmentada porque el servidor de alojamiento no está transmitiendo cosas, pero a menudo no configuran un encabezado Content-Length (si esto es cumplimiento estándar o no, the standard says que a menos que esté prohibido por otras reglas, este encabezado DEBE establecerse, aunque se trata de casos del mundo real que deben tratarse en cualquier caso).

Comprobé esto con mi propio servidor local, y cuando configuré un Content-Length, el nodo de repente funciona bien.

Como @dhofstet menciona en los comentarios (y en la edición), se encontró con una URL que también rompe nodo: www.cnbc.com/id/41863659/
Cuando se ha publicado esto, he comprobado, y lo hizo de hecho romper el http.get(). He vuelto a comprobar ahora, y en el momento de escribir la url ahora se emite un encabezado Content-Length, y milagro de milagros, el nodo ya no se bloquea en esa url.

Sería bueno si alguien pudiera confirmar esto (no debería tardar demasiado en configurar un servidor localhost si aún no tiene uno, y proporcionar una respuesta básica con encabezados personalizados).

+1

Suena así responde la pregunta. De lo contrario, intente usar [la biblioteca de solicitudes de Mikeal] (https: // github.com/mikeal/request), ya que minimizará cualquier error que pueda estar cometiendo (o presente un error). Además, deténgase en [# node.js] (http://webchat.freenode.net/?channels=node.js&uio=d4) y haga preguntas para una respuesta más rápida :) Asegúrese de informar sus conclusiones. – DTrejo

+0

Estaba enfrentando el mismo problema en el nodo v0.3.7, pero el problema desapareció una vez que actualicé a 0.4.7 – Jayesh

1

puede actualizar el nodo utilizando

$ sudo n estable

tengo este problema común y se resuelven mediante la actualización del nodo

Cuestiones relacionadas