node.js process.nextTick错误

时间:2011-03-13 02:16:39

标签: 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);
    });
});

抛出错误:

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时,我得到了所需的网页。此外,在Web主机日志中,我可以看到已经成功连接(如果我使用的话,那就是localhost而不是127.0.0.1。这只是暂时的。) p>

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

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

之前有人看过/处理过这个问题吗?

2 个答案:

答案 0 :(得分:8)

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

  

没有Content-Length HTTP时   报头中。

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

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

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

如果有人可以确认这一点会很好(如果您还没有设置本地主机服务器,则不需要太长时间,并且使用自定义标头提供基本响应)。

答案 1 :(得分:1)

您可以使用

更新节点

$ sudo n stable

我遇到普通问题并通过更新节点来解决问题