2017-11-12 2 views
0

원격 서비스에 많은 websocket 요청을 수행하는 노드에 응용 프로그램을 작성하고 있습니다 (ws library 사용). 따라서 원격 서비스는 서버이고 내 노드 응용 프로그램은 클라이언트입니다. 그것은 아주 잘 작동하지만, 때때로 갑자기 다음 TimeoutError의 긴 목록을 얻을 : 내가 지금있는이 오류가 발생 호출 궁금해 다양한 웹 소켓 호출을 할 수 있기 때문에노드 TimeoutError를 catch하고 요청을 기록하는 방법은 무엇입니까?

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) 

합니다. 나는 아래에 붙이기 때문에 시도/캐치에 ws.send()을 감싸려고했으나 아무 것도하지 않는 것 같습니다.

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); 
}; 

을하지만 불행히도 이것은 또한 작동하지 않습니다. 이 질문의 맨 위에 게시 할 때와 동일한 오류가 발생합니다.

다른 아이디어?

답변

1

ws.library send() 메서드는 오류가 발생하면 호출되는 선택적 콜백을 사용합니다. 당신이 발견, 그것은 비동기 오류에 도움이되지 않습니다,

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

시도/캐치는 즉시 오류를 잡을 것입니다,하지만 : 당신과 함께 이러한 오류를 잡을 수 있습니다.

다른 비동기 코드에서 send()을 호출하는 것처럼 보입니다 (오류가 발생하는 것이 아니라 처리되지 않은 약속 거부가 표시됨). 자신의 코드에있는 경우 해당 약속에 .catch()을 추가 할 수 있습니다.

+0

.. :-) 비록 적절한 웹 소켓 오류보고가있다. 따라서 그들은 ack error 콜백에 의해 잡히지 않습니다. 나는 그것을 초기 질문에 추가했다. 내가 뭘 잘못했는지 알기나 해? – kramer65

1

오류 수신을 위해 onerror websocket 객체의 콜백을 사용할 수 있습니다.

예 :

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/

Link2부터 : http://jsfiddle.net/g28yuymv/10/

+0

나는 당신의 제안을 시도했지만, 불행히도 나는 처음에 '처리되지 않은 거부 TimeoutError'를 얻는다. 이 문제를 해결하기 위해 내가 뭘 할 수 있을까? – kramer65

0

좋아, 나 바보. 조금 더 나은 초기 오류를보고 난 후 generic-pool 패키지의 오류였습니다. its npm page에 그것이

a Promise based API, which can be used to reuse or throttle usage of expensive resources such as database connections

문제

은 (광범위하게 사용됩니다) 내 데이터베이스 연결을 밝혀졌다 말한다.나는 다음과 같이 sequelize 초기화 풀 설정을 설정하는 제안 this tip on github를 사용하여 그것을 해결 :

수영장 : {최대 : 5 분 : 0, 유휴 : 20000 획득 : 20000} 나를 위해 그것을 해결

을 . 답변에

덕분에, 지금 내가 코드를 시도했지만 내가 한 번, 난 여전히 이전과 같은 오류를 가지고

관련 문제