如何在使用iojs创buildhttp请求时捕获EHOSTDOWN套接字错误?
我有一个简单的iojs http服务器,与我的开发机器上的另一个http后端进行通信。 现在我的IP已经改变,后端请求将不会工作,由于错误的IP。 我有(或至less是这样认为)错误pipe理,但是由于未处理的exception,在某些情况下,服务器崩溃:
当执行2个后续请求时,第一个请求会“挂起”,然后第二个请求会使服务器崩溃:
events.js:141 throw er; // Unhandled 'error' event ^ Error: connect EHOSTDOWN 192.168.1.11:80 - Local (192.168.1.10:54125) at Object.exports._errnoException (util.js:846:11) at exports._exceptionWithHostPort (util.js:869:20) at connect (net.js:840:14) at lookupAndConnect (net.js:933:5) at Socket.connect (net.js:902:5) at Agent.exports.connect.exports.createConnection (net.js:61:35) at Agent.createSocket (_http_agent.js:177:16) at Agent.addRequest (_http_agent.js:147:23) at new ClientRequest (_http_client.js:132:16) at Object.exports.request (http.js:30:10)
有问题的错误将不会触发backRequest.on("error", errFn)
,它不是一个标准错误,如function(err, response, body)
。 它不能捕捉使用try … catch。
我怎样才能抓住和优雅地处理这个错误?
我已经挖了一点net.js / http.js。 当手动发送套接字错误时:
backendRequest.on("socket", function(socket) { socket.emit("error", "DIE!"); });
它由正常的error handling程序处理。 但是EHOSTDOWN错误不是。 原因似乎是Socketerror handling程序只安装在Socket.connect()之后的下一个tick(请参阅https://github.com/joyent/node/blob/master/lib/_http_client.js#L498 )。
然而,“我的”错误直接在connect()(必须与第一个连接仍在尝试查找主机)之间触发。
我可以使用自定义的Agent.createConnection正常捕获该错误:
var socket = net.createConnection(options); // install error handler immediately socket.on("error", function(err) { console.log("AHA", err); }); return socket;
但是,这看起来很冗长和笨重。 这真的是最好的办法吗? 错误似乎不是特别的,似乎是在核心库中未处理。 为什么是这样,为什么只在nextTick上安装套接字error handling程序?
你将如何正确地捕捉到这个错误? 代理是正确的方式吗?
可以在这里find一个“完整”的例子: http : //pastebin.com/jaCUPaHX
正如评论者指出的那样:这是一个错误https://github.com/nodejs/io.js/pull/2054
- 在HTTP模式下,node.js是否比Java有更大的性能优势?
- 通过Node.js + websocket服务器上的游戏对象循环播放?
- 带会话处理的套接字。 在Post方法上创build会话。 服务器端值被设置。 但发射到客户端刷新
- node.js socket.io获取cookie值
- nodejs中是否有一种“Socket连接池”?
- 如何实现我的网站的实时推送通知?
- Node.js + Socket.io + MongoDB webapps如何真正asynchronous?
- socket.io +使用“发射”与callback?
- React和Socket.io:能够获取初始数据 – 但是当新post进来时视图不会更新