我在节点中编写了一个应用程序,我在其中向远程服务做了很多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);
};
但不幸的是,这似乎也不起作用。我仍然得到与我在这个问题的顶部发布的相同的错误。
还有其他想法吗?
答案 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");
}
答案 2 :(得分:0)
基于Promise的API,可用于重用或限制使用 昂贵的资源,如数据库连接
问题原来是我的数据库连接(广泛使用)。我使用this tip on github解决了它,建议按如下方式设置sequelize init池设置:
pool:{max:5,min:0,idle:20000,acquire:20000}
这解决了我。
感谢答案,我现在有正确的websocket错误报告但是: - )