如何捕获节点TimeoutError并记录请求?

时间:2017-11-12 19:20:59

标签: node.js websocket timeout try-catch

我在节点中编写了一个应用程序,我在其中向远程服务做了很多websocket请求(使用ws library)。所以远程服务是服务器,我的节点应用程序是客户端。它工作得很好,但偶尔我会突然得到以下TimeoutError的长列表:

Unhandled rejection TimeoutError: ResourceRequest timed out
    at ResourceRequest._fireTimeout (/Users/kramer65/repos/mmj/node_modules/generic-pool/lib/ResourceRequest.js:58:17)
    at Timeout.bound (/Users/kramer65/repos/mmj/node_modules/generic-pool/lib/ResourceRequest.js:8:15)
    at ontimeout (timers.js:386:11)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)

由于我做了很多不同的websocket调用,我现在想知道这个错误发生了哪个调用。我尝试将ws.send()包裹在下面粘贴的try / catch中,但这似乎没有做任何事情。

try {
    ws.send(request_json);
} catch(e) {
    console.log('WEBSOCKET ERROR', e);
    console.log('WEBSOCKET JSON', request_json);
}

有人知道如何捕获TimeoutError并记录请求内容吗?欢迎所有提示!

[编辑] 正如@Mark_M所建议的,我添加了对ws.send()方法的回调,如下所示:

ws.send(JSON.stringify(request_obj)), (error)=>{
    console.log('WEBSOCKET ERROR', request_obj.action, error);
});

不幸的是,我仍然遇到与我在此问题顶部发布的错误相同的错误。

[EDIT2] 我也尝试过@wrangler提出的建议:

ws.send(JSON.stringify(request_obj));
ws.onerror = function(event) {
    console.log('WEBSOCKET ONERROR', request_obj.action, event);
};
ws.onclose = function (event){
    console.log('WEBSOCKET ONCLOSE', request_obj.action, event);
};

但不幸的是,这似乎也不起作用。我仍然得到与我在这个问题的顶部发布的相同的错误。

还有其他想法吗?

3 个答案:

答案 0 :(得分:1)

ws.library send()方法接受一个可选的回调函数,当它遇到错误时会被调用。您可以通过以下方式捕获这些错误:

ws.send('something', function ack(error) {
   if(error) //handle error
}

尝试/ catch会立即捕获错误,但是,正如您所注意到的,它对异步错误没有帮助。

或者,您似乎在其他一些异步代码中调用send()(因为您不会收到错误,而您正在获得未处理的承诺拒绝)。您可以在该承诺中添加.catch(),如果它在您自己的代码中。

答案 1 :(得分:1)

您可以使用websocket对象的onerror回调来接收任何错误。

示例:

var exampleSocket = new WebSocket("ws://echo.websocket.org");
    exampleSocket.onopen = function (event) {
        console.log("open");
      exampleSocket.send("hellow world"); 
    };
    exampleSocket.onmessage = function (event) {
      console.log(event.data);
    }

    exampleSocket.onerror=function(event){
        console.log("Error");
    }

链接:http://jsfiddle.net/g28yuymv/1/

链路2:http://jsfiddle.net/g28yuymv/10/

答案 2 :(得分:0)

好的,愚蠢的我。在查看初始错误后,我发现{{1}}包中的错误。在its npm page它说它

  

基于Promise的API,可用于重用或限制使用   昂贵的资源,如数据库连接

问题原来是我的数据库连接(广泛使用)。我使用this tip on github解决了它,建议按如下方式设置sequelize init池设置:

pool:{max:5,min:0,idle:20000,acquire:20000}

这解决了我。

感谢答案,我现在有正确的websocket错误报告但是: - )