node.js process.nextTick错误

dav*_*vin 16 node.js

我在使用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);
    });
});
Run Code Online (Sandbox Code Playgroud)

抛出错误:

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)
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中浏览到127.0.0.1:9000时,我得到了所需的网页.此外,在Web主机日志中,我可以看到已经有一个成功的连接(如果我使用的话就不会发生这种情况,比如说,localhost而不是127.0.0.1.只是旁边).

我说这很有趣,因为如果我将主机更改为谷歌或者什么都可以正常工作,它会将html吐出到控制台.

我应该注意,我在cygwin下运行节点0.4.2,从源代码构建.

以前见过/处理过这个的人?

dav*_*vin 8

我很确定我已经找出导致此错误的原因:

没有Content-LengthHTTP标头时.

在某些情况下,忽略此标头,特别Transfer-Encoding: chunked是在设置时,然后节点播放良好.但是对于节点的基本获取,传输编码通常不会被设置为分块,因为托管服务器不是流式传输服务器,但是它们通常不设置Content-Length标头(标准符合性是否有问题,标准说除非其他规则禁止,否则应该设置此标题,尽管这些是真实世界的情况,在任何情况下都应该处理).

我用自己的localhost检查了这个,当我设置一个时Content-Length,节点突然变得很好.

正如@dhofstet在评论中(以及在问题中)中提到的,他发现了一个也打破节点的网址:www.cnbc.com/id/41863659/
当他发布这个时,我检查过,确实打破了http.get().我现在重新检查,在编写时,url现在确实发出了一个Content-Length标题,奇迹的奇迹,节点不再在该网址上崩溃.

如果有人能够确认这一点会很好(如果您还没有设置本地主机服务器,则应该花费很长时间,并使用自定义标头进行基本响应).