nodejs events.js:141未处理的错误事件ETIMEDOUT

时间:2018-01-10 02:45:18

标签: javascript node.js asynchronous events heroku

我有一个带有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();
}

1 个答案:

答案 0 :(得分:0)

也许ETIMEOUT是由网站的服务器引起的,无论如何你都可以发现错误

const req = https.request(options, callback)

req.on('error', (e) => {
  console.error(e);
});

req.end();