我有一个带有node.js的Heroku服务器并表示每秒都会ping一个网站的API。这可以一次好几个小时,但每隔一段时间我就会收到这个错误:
2018-01-10T02:19:28.579566+00:00 app[web.1]: events.js:141
2018-01-10T02:19:28.579578+00:00 app[web.1]: throw er; // Unhandled 'error' event
2018-01-10T02:19:28.579579+00:00 app[web.1]: ^
2018-01-10T02:19:28.579581+00:00 app[web.1]:
2018-01-10T02:19:28.579582+00:00 app[web.1]: Error: connect ETIMEDOUT 45.60.11.241:443
2018-01-10T02:19:28.579583+00:00 app[web.1]: at Object.exports._errnoException (util.js:907:11)
2018-01-10T02:19:28.579584+00:00 app[web.1]: at exports._exceptionWithHostPort (util.js:930:20)
2018-01-10T02:19:28.579585+00:00 app[web.1]: at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1078:14)
2018-01-10T02:19:28.684990+00:00 heroku[web.1]: Process exited with status 1
有时错误是ETIMEDOUT,但有时它是其他东西(现在不记得)。
我读到的其他一些帖子让我觉得这可能是个问题?
app.listen(app.get('port'), function() {
console.log("Node app is running at localhost:" + app.get('port'))
})
或者它可能是API调用循环中的部分?
try
{
async.series([
function(callback) {
apiQuery( callback, method, params);
},
], function(error, results) {
console.log(results)
});
}
catch(e)
{
console.log("something went wrong!")
}
不确定为什么try catch没有捕获错误,如果是这样的话。
也许这就是我开始循环的方式?
runLoop()
//start looping the api data pulls
function runLoop() {
setInterval(apiLoop, 1000)
}
在回调函数中让apiLoop调用自身会更好吗?或者是否会创建嵌套函数来继续使用越来越大的内存?
这是api呼叫代码:
function apiQuery( callback2, method, params )
{
if ( ! params ) params = [];
var host_name = 'www.host.com';
var url = '/Api/' + method;
if ( params ) url += "/" + params.join('/');
var options = {
host: host_name,
path: url,
};
callback = function(response) {
var str = '';
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
return callback2(null, str);
});
}
https.request(options, callback).end();
}
答案 0 :(得分:0)
也许ETIMEOUT是由网站的服务器引起的,无论如何你都可以发现错误
const req = https.request(options, callback)
req.on('error', (e) => {
console.error(e);
});
req.end();