node.js process.nextTick错误
我遇到了一些与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时,我得到了所需的网页。 此外,在networking主机日志中,我可以看到已经有一个成功的连接(如果使用localhost
而不是127.0.0.1
,则不会发生这种情况)。
我说这很有趣,因为如果我把主机更改为谷歌或不是一切正常,它吐出的HTML到控制台。
我应该注意到,我正在运行cygwin下的节点0.4.2,它是从源代码构build的。
任何人看到/处理过这个?
我很确定我已经找出了导致这个错误的原因:
当没有
Content-Length
HTTP标头时。
有些情况下,这个头被忽略,特别是当Transfer-Encoding: chunked
被设置,然后节点播放很好。 然而,对于基本的节点获取,传输编码通常不会被设置为分块,因为托pipe服务器不是stream媒体的东西,但他们通常不设置一个Content-Length
头(不pipe这是否符合标准是有问题的, 该标准说 ,除非其他规则禁止这个标题应该被设置,虽然这些都是真实世界的情况下,应该在任何情况下处理)。
我用我自己的本地主机检查了这一点,当我设置一个Content-Length
,节点突然好起来。
正如@dhofstet在评论(和问题)中提到的,他发现了一个也打破了节点的URL:www.cnbc.com/id/41863659/
当他发布这个,我检查,它确实打破了http.get()
。 我现在重新检查了一下,在写这篇文章的时候,URL发出了一个Content-Length
头,奇迹的奇迹,节点不再在这个url上崩溃。
如果有人能证实这一点(如果你还没有安装本地主机服务器,不需要太长的时间就可以了),并且用自定义头文件提供一个基本的响应。
您可以使用更新节点
$ sudo n stable
我有这个普通的问题,并通过更新节点解决