[英]How to find the source of a connect ECONNREFUSED error in node.js?
我继承了具有合理复杂性的nodejs应用程序。 它通过各种网络接口(主要是HTTP REST API)与其他5个应用程序进行交互。 我时不时地遇到一个引发错误的问题,在处理该错误以防止应用程序崩溃的同时,我也不知道错误是从哪里来的。 这是我从此错误中获得的典型信息:
就是这样。 这就是整个消息和堆栈跟踪信息(消息实际上在errno=ECONNREFUSED
和syscall=connect
重复了,没有帮助)。 我正在使用nodejs 0.12.2,并将stacktrace行相应地链接到源。 我已经阅读了源代码,但没有得到任何帮助。
我还浏览了SO上与ECONNREFUSED
有关的许多问题,但这些问题始终带有代码示例。 如果我知道我的applicatino的哪一部分是对网络请求的响应,则可以修复它。
所以我的问题是,我该如何检测节点应用程序以找出失败的请求来自何处?
PS:我也查看了调试nodejs应用程序的建议 ,但没有找到任何答案 。
该错误是由主机拒绝的从内核返回的TCP连接引起的-您需要进行一些错误处理并重试尝试以避免这些问题。 尝试cUrl
荷兰国际集团的网址,以确保它不是东西,是不对您的机器。
您可以使用域模块来封装代码,并确保保留发生错误的上下文。 此外,您应始终为回调等创建命名函数,因为这至少会为您指明正确的方向。
如果您需要的话,还有一些库可以尝试重试HTTP请求等。
以下代码段记录了所有http连接的错误,而与他们的呼叫站点无关:
// install error handler on all sockets to provide context for ECONNREFUSED and smilar errors
// this is not an official API and may break at some point
// it will also likely log this error multiple times, which the socketErrorId helps identify
var http = require('http');
var net = require('net');
var errorCounter = 0;
http.globalAgent.createConnection = function (options) {
var socket = net.createConnection(options)
socket.on('error', function (error) {
errorCounter += 1;
error.socketErrorId = errorCounter;
console.log('socket error, while connecting to ', options.href, error);
})
return socket
}
我已经在生产环境中运行了一周,它可以帮助您确定无法确定的连接问题。
options对象具有更多属性,而不仅仅是href
,尽管那对我来说最有用。 这是我所做的测试的完整列表: domain, _events, _maxListeners, callback, uri, headers, method, readable, writable, explicitMethod, _qs, _auth, _oauth, _multipart, _redirect, _tunnel, setHeader, hasHeader, getHeader, removeHeader, localAddress, pool, dests, __isRequestRequest, _callback, proxy, tunnel, setHost, originalCookieHeader, _disableCookies, _jar, port, host, path, httpModule, agentClass, agent, _started, href, servername, encoding
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.