2017-11-12 25 views
0

私はリモートサービス(多くのWebソケット要求をws libraryを使って行うノードでアプリケーションを書いています)。したがって、リモートサービスはサーバーであり、ノードアプリケーションはクライアントです。これはかなりうまく動作しますが、時折私は突然、次のTimeoutErrorの長いリストを取得:私は今、そのためにこのエラーが発生した呼び出し不思議、さまざまのWebSocket呼び出しを行うのでノード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) 

を。私は下に貼り付けたので、ws.send()をtry/catchでラップしようとしましたが、何もしないようです。

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

どのように私はTimeoutErrorをキャッチして要求の内容を記録することができます知っていますか?すべてのヒントは大歓迎です!

次のように私はws.send()メソッドへのコールバックを追加@Mark_Mによって示唆されるように[EDIT] :

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 
} 

のtry/catchはすぐにエラーをキャッチしますが、:あなたがこれらのエラーをキャッチすることができます。

また、他の非同期コード内でsend()と呼んでいるようです(エラーが発生しているだけでなく、未処理の約束を拒否しているため)。あなた自身のコードにある場合は、その約束に.catch()を追加することができます。

+0

私はあなたのコードを試してみましたが、私がした後、私はまだ前と同じエラーを得ました。だから彼らはackエラーコールバックに捕まえられません。私は最初の質問にそれを加えました。私は間違って何をすることができますか? – 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/

リンク2:http://jsfiddle.net/g28yuymv/10/

+0

私はあなたの提案を試みましたが、残念ながら私は最初に得た '未処理の拒否TimeoutError'を取得しました。これを解決するために他に何ができますか? – kramer65

0

[OK]を、私の愚かな。最初のエラーを少し調べたところ、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のinitプール設定を設定することを提案this tip on githubを使用して解く:

プール:{最大:5、最小:0、アイドル:20000は、取得:20000}私のためにそれを解決

を。

の答えのおかげで、私は今、しかし、適切なWebSocketのエラー報告があります。.. :-)