2014-09-11 6 views
32

मान लें कि मेरे पास पोर्ट nn पोर्ट के साथ एक नोड सर्वर शुरू हुआ है, और इसमें कोई भी वेबस्केट सेवा नहीं है।'वेबस्केट कनेक्शन' को कैसे पकड़ें ws: // xxx: nn 'विफल: हैंडशेक प्रतिक्रिया प्राप्त करने से पहले कनेक्शन बंद हुआ' त्रुटि?

और समस्या यह है कि मेरा ग्राहक इस सर्वर पर वेबसॉकेट सेवा को जोड़ने का प्रयास करता है।

जाहिर है, यह सर्वर से कनेक्ट करने में विफल होना चाहिए।

लेकिन मैं निम्नलिखित के रूप में इस त्रुटि मेरे मुवक्किल कोड पकड़ नहीं सकता है,:

try { 
    this.ws = new WebSocket('ws://xxx:nn'); 
} catch (e) { 
    fallback(); 
    console.warn(e); 
} 

मेरे उम्मीद fallback विधि को जोड़ने में विफल रहा है, जबकि कहा जाता हो, लेकिन वास्तव में त्रुटि है कि मैं करने के लिए यह ऊपर से पकड़ा जा सकता है try...catch

क्या कोई जानता है कि मेरे उपयोगकेस में त्रुटि कैसे पकड़ें?

+5

आप अंत इस के लिए एक समाधान खोजने की थी? – orange

+2

[जावास्क्रिप्ट को वेबसॉकेट तत्काल में त्रुटि नहीं मिलती है] के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/31002592/javascript-doesnt-catch-error-in-websocket-instantiation) –

उत्तर

4

आप WebSocket वस्तु की onError कॉलबैक के लिए रजिस्टर कर सकते हैं

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

आप उदाहरण का अनुसरण करते देख सकते हैं। http://jsfiddle.net/g28yuymv/1/

त्रुटि उदाहरण http://jsfiddle.net/g28yuymv/4/

+2

यह काम नहीं करेगा, मैं कोशिश की। मेरा मामला है कि मेरे पास पोर्ट 'एनएन' पर चल रहा एक सर्वर है, लेकिन इसमें कोई भी वेबस्केट सेवा नहीं है। जब ग्राहक वेबसाईट का उपयोग करके इस सर्वर को कनेक्ट करने का प्रयास करते हैं, तो त्रुटि फेंक दी जाती है, और न तो 'try..catch' और न ही 'आतंक' इस अपवाद को पकड़ नहीं सकता – Howard

+2

ठीक @ हावर्ड। मेरे उदाहरण में (http: // jsfiddle। नेट/g28yuymv/10 /) अगर अनुरोधित बंदरगाह पर कोई डब्ल्यूएस सेवा नहीं चल रही है तो मैं इरर इवेंट प्राप्त करने में सक्षम हूं। अगर आपने किसी भी सार्वजनिक क्लाउड पर किसी भी डब्ल्यूएस सेवा की मेजबानी की है तो मुझे परीक्षण यूआरएल पता है। मेरे अनुसार आप "500 आंतरिक सर्वर त्रुटि" व्यवहार मार रहे हैं। – shivakumar

+0

धन्यवाद। मैं इस व्यवहार के लिए अधिक परीक्षण कर सकता हूं – Howard

3
1 को

readyState संपत्ति सेट जब कनेक्शन इसलिए सफल हुआ यह कनेक्शन स्थिति का निर्धारण करने के लिए इस्तेमाल किया जा सकता है को पकड़ने, गर्तिका कनेक्शन आमतौर पर < 1 सेकंड लेता है, तो हम सुरक्षित रूप से 3 सेकंड ले जा सकते हैं अंतराल और फिर कनेक्शन स्थिति की जांच करें।

के बाद कोड

this.ws = new WebSocket('ws://xxx:nn'); 

     setTimeout(function() { 


      if (this.ws.readyState != 1) { 
       alert("Problem connection , kindly contact system admin ."); 
      } 


     }, 3000); 
+0

कृपया अपने उत्तर में अपने कोड का स्पष्टीकरण जोड़ें। – rgettman

+0

@getgetman स्पष्टीकरण जोड़ा गया। –

7

एचटीएमएल 5 WebSockets कल्पना को देखते है, तो आप विधि पास() में कोई मान पारित कर सकते हैं। फिर ऑनक्लोज़() ईवेंट श्रोता पर आप उस मान के खिलाफ जांच सकते हैं। यह आपको विभिन्न डिस्कनेक्ट परिदृश्यों के लिए हैंडलर सेट करने का अवसर देता है और फिर सामान्य त्रुटि के रूप में अन्य सभी को संभालता है।

https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#close()

var _websocket; 

function wsConnect() { 
    if (_websocket) { 
    _websocket.close(3001); 
    } else { 
    _websocket = new WebSocket("wss://echo.websocket.org1"); 
    _websocket.onopen = function() { 
     console.log('connected'); 
    }; 
    _websocket.onmessage = function(msg) { 
     console.log(msg); 
    }; 

    _websocket.onclose = function(evt) { 
     if (evt.code == 3001) { 
     console.log('ws closed'); 
     _websocket = null; 
     } else { 
     _websocket = null; 
     console.log('ws connection error'); 
     } 
    }; 

    _websocket.onerror = function(evt) { 
     if (_websocket.readyState == 1) { 
     console.log('ws normal error: ' + evt.type); 
     } 
    }; 
    } 
} 

wsConnect(); 

मिठाई बेला: https://jsfiddle.net/lamarant/ry0ty52n/

+0

जब भी मेरी स्क्रिप्ट वेबसाईट सर्वर से पुनः कनेक्ट करने का प्रयास करती है, तो मैं ECONREFUSED त्रुटि को पकड़ना चाहता था, ऊपर कोड पूरी तरह से काम करता है, यह मेरे नोडजेस स्क्रिप्ट को पुनः कनेक्ट करने के दौरान क्रैश होने से बचाता है। – Jayant

संबंधित मुद्दे