首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用iojs创建http请求时,如何捕获EHOSTDOWN套接字错误?

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

Stack Overflow用户
提问于 2015-05-26 12:37:06
回答 1查看 4.3K关注 0票数 2

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

当执行两个后续请求时,第一个请求“挂起”,然后第二个请求使服务器崩溃:

代码语言:javascript
复制
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。手动发出套接字错误时:

代码语言:javascript
复制
backendRequest.on("socket", function(socket) {
    socket.emit("error", "DIE!");
});

它由正常的错误处理程序处理。然而,EHOSTDOWN错误不是。原因似乎是套接字错误处理程序只安装在Socket.connect()之后的下一个滴答上(参见client.js#L498)。

但是,"My“错误是在connect()时直接触发的(必须与仍然试图查找主机的第一个连接有关)。

我可以使用自定义Agent.createConnection来优雅地捕获该错误:

代码语言:javascript
复制
var socket = net.createConnection(options);
// install error handler immediately
socket.on("error", function(err) {
    console.log("AHA", err);
});
return socket;

然而,这似乎非常冗长和笨重。这真的是最好的方法吗?这个错误似乎并没有那么特殊,而且在核心库中似乎没有得到处理。为什么是这样,为什么套接字错误处理程序只安装在nextTick上?

你如何正确地捕捉到这个错误?代理是正确的方式吗?

可以在这里找到一个“完整”的可玩示例:http://pastebin.com/jaCUPaHX

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-02 06:15:40

正如评论者所指出的:这是一个bug https://github.com/nodejs/io.js/pull/2054

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30458800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档