在使用iojs创建http请求时,如何捕获EHOSTDOWN套接字错误?

时间:2015-05-26 12:37:06

标签: javascript node.js sockets http

我有一个简单的iojs http服务器,它与我的开发机器上的另一个http后端进行通信。现在我的ip已经改变了,后端请求由于错误的ip而无法正常工作。我有(或至少是这么认为)错误管理,但是由于未处理的异常,服务器在某些情况下崩溃:

当做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!");
});

它由普通的错误处理程序处理。但是,EHOSTDOWN错误不是。原因似乎是套接字错误处理程序仅安装在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上?

您如何正确捕捉到该错误?代理人是正确的方式吗?

A"完整"可以在此处找到要玩的示例:http://pastebin.com/jaCUPaHX

1 个答案:

答案 0 :(得分:0)

评论者指出:这是一个错误https://github.com/nodejs/io.js/pull/2054