我有一个简单的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()之后的下一个刻度上(请参阅https://github.com/joyent/node/blob/master/lib/_http_client.js#L498)。
但是,“ my”错误是在connect()上直接触发的(必须与第一个仍在尝试查找主机的连接有关)。
我可以使用自定义Agent.createConnection优雅地捕获该错误:
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
正如评论者所指出的:这是一个错误https://github.com/nodejs/io.js/pull/2054
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句