我在使用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,是从源代码构建的。
之前有人看过/处理过这个问题吗?
答案 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
我遇到普通问题并通过更新节点来解决问题