2015-06-23 10 views
13

में त्रुटि नहीं मिलती है मेरी सॉकेट वर्तमान में नेट :: ERR_CONNECTION_REFUSED फेंकता है क्योंकि सर्वर नहीं चल रहा है, जिसे मैं इस समय करना चाहता हूं।जावास्क्रिप्ट को वेबसॉकेट इंस्टेंटेशन

समस्या यह है कि कोड के निम्नलिखित भाग में त्रुटि नहीं होती है। कंसोल में मुझे लाइन 2 पर एक अपवाद दिखाई देता है (नेट :: ERR_CONNECTION_REFUSED के साथ) जो मुझे विश्वास है कि ऐसा नहीं होना चाहिए क्योंकि यह एक कोशिश कथन के भीतर है।

1 try { 
2 ws = new WebSocket('ws://'+ host + ':' + port + '/'); 
3 } 
4 catch (err) { 
5 console.log('This never prints'); 
6 } 
7 ws.onerror = function (error) { 
8 console.log(error); 
9 }; 

तो मेरा सवाल यह है कि क्यों नहीं पकड़ा जा रहा है?

जो मैं अंततः चाहता हूं वह त्रुटि संदेश कहीं और प्रदर्शित किया जा सकता है, लेकिन मैं इसे पकड़ नहीं सकता, और लाइन 8 एक "ईवेंट" ऑब्जेक्ट प्रिंट करता है जिसमें नेट :: ERR_CONNECTION_REFUSED का उल्लेख नहीं है, इसलिए मुझे यकीन नहीं है त्रुटि संदेश कैसे प्राप्त करें।

उत्तर

34

WebSocket के संबंध-टाइम त्रुटि एक भेजा घटना का कारण बनता है, न कि एक फेंका मूल्य। ऐसा इसलिए है क्योंकि throw संचालन तुल्यकालिक होना चाहिए। सभी कनेक्शन-टाइम त्रुटियों को फेंकने वाली त्रुटियों के रूप में संभालने के लिए, WebSocket कन्स्ट्रक्टर को पूरी वेबस्केट हैंडशेक पूरा होने तक सभी स्क्रिप्ट निष्पादन और UI इंटरैक्शन को पूरी तरह से निलंबित करने की आवश्यकता होगी। इसके बजाए, कनेक्शन प्रक्रिया असीमित रूप से चलती है, जिससे ब्राउज़र थ्रेड पृष्ठभूमि में प्रारंभ होने पर ब्राउज़र थ्रेड को काम जारी रखने की इजाजत देता है। कनेक्शन की असीमित प्रकृति की वजह से, WebSocket को error ईवेंट के माध्यम से त्रुटियों की रिपोर्ट करनी चाहिए, क्योंकि सिंक्रोनस new WebSocket ऑपरेशन पहले ही समाप्त हो चुका है जब तक कि एसिंक्रोनस कनेक्शन कार्य में कोई त्रुटि आती है।

ERR_CONNECTION_REFUSED संदेश जो आप देखते हैं वह पूरी तरह से डेवलपर्स के लाभ के लिए है; यह किसी भी तरह से लिपि के लिए सुलभ नहीं है। इसका जावास्क्रिप्ट वातावरण में कोई प्रतिनिधित्व नहीं है। यह सिर्फ एक लाल रंग का संदेश है जो आपके कंसोल में आपको सूचित करने के लिए प्रकट होता है, जो मानव ब्राउज़र को एक त्रुटि के बारे में देखता है।

error हैंडलर घटना विफलता का जवाब देने के लिए सही जगह है, लेकिन स्क्रिप्ट-पठनीय कनेक्शन-समय त्रुटि जानकारी की कमी डिज़ाइन द्वारा है। WHATWG spec for the WebSocket API से:

उपयोगकर्ता एजेंट एक तरीका है कि एक स्क्रिप्ट निम्न स्थितियों भेद करने की अनुमति होगी में स्क्रिप्ट के लिए किसी भी विफलता जानकारी देना नहीं होना चाहिए:

  • जिसका होस्ट नाम हल नहीं किया जा सकता है एक सर्वर।
  • एक सर्वर जिस पैकेट को सफलतापूर्वक रूट नहीं किया जा सका।
  • एक सर्वर जो निर्दिष्ट पोर्ट पर कनेक्शन से इनकार कर दिया।
  • एक सर्वर जो एक टीएलएस हैंडशेक सही ढंग से करने में विफल रहा (उदा।, सर्वर प्रमाणपत्र सत्यापित नहीं किया जा सकता है)।
  • एक सर्वर जिसने ओपनिंग हैंडशेक पूरा नहीं किया (उदा। क्योंकि यह वेबस्केट सर्वर नहीं था)।
  • एक वेबसेट सर्वर जो एक सही खोलने वाले हैंडशेक भेजता है, लेकिन निर्दिष्ट विकल्प जो क्लाइंट कनेक्शन को छोड़ने के कारण उत्पन्न करते हैं (उदा। सर्वर ने एक सबप्रोटोकॉल निर्दिष्ट किया है जिसे क्लाइंट ने नहीं दिया था)।
  • एक वेबसॉकेट सर्वर जो सफलतापूर्वक उद्घाटन हैंडशेक को पूरा करने के बाद कनेक्शन को बंद कर देता है।

[...] इन मामलों में अंतर करने के लिए एक स्क्रिप्ट को अनुमति देने से स्क्रिप्ट को उपयोगकर्ता के स्थानीय नेटवर्क को हमले की तैयारी में जांचने की अनुमति मिल जाएगी।

ब्राउज़र जानबूझकर कल्पना के अनुसार आवश्यक किसी भी उपयोगी जानकारी को छोड़ रहा है। Spec लेखकों का संबंध है कि इस जानकारी तक पहुंच दुर्भावनापूर्ण वेब पेज को आपके नेटवर्क के बारे में जानकारी प्राप्त करने की अनुमति दे सकती है, इसलिए उन्हें सभी कनेक्शन-समय त्रुटियों को एक अलग तरीके से रिपोर्ट करने की आवश्यकता होती है।

+0

यह बहुत उपयोगी जानकारी है, हालांकि मुझे नहीं लगता कि अपवाद "पकड़ा" क्यों नहीं है। ऐसा लगता है कि भाषा के मौलिक ढांचे को तोड़ना है। मुझे लगता है कि जो कुछ मैं चाहता हूं उसे करने का तरीका बंद करना होगा और क्लोजएवेंट के कोड को देखना होगा। – andyhasit

+4

@AndyHasIt मैंने इसके बारे में एक उद्घाटन अनुच्छेद जोड़ा; मुझे उम्मीद है कि यह काफी स्पष्ट है। असल में, हम एक त्रुटि को पकड़ नहीं सकते हैं क्योंकि एसिंक्रोनस कनेक्शन प्रयास में त्रुटि से मुकाबला करने से पहले हम सिंक्रनाइज़ रूप से 'try' ब्लॉक से बाहर निकलते हैं। – apsillers

+0

आपकी मदद के लिए धन्यवाद, सही समझ में आता है। – andyhasit

0

मैंने के साथ बेवकूफ बनाने की कोशिश की और मैं लाइन मुद्रित देखने में सक्षम हूं।

host='localhost'; 
port=100; 
try { 

    ws = new WebSocket('ws://'+ host + ':' + port + '/'); 
    } 
    catch (err) { 
    console.log('This never prints'); 
    } 
    ws.onerror = function (error) { 
    console.log(error); 
    }; 

https://jsfiddle.net/xzumgag0/

+1

यह एक अलग त्रुटि के कारण है, हालांकि: "एक असुरक्षित वेबसॉकेट कनेक्शन HTTPS पर लोड किए गए पृष्ठ से शुरू नहीं किया जा सकता है।" – dfreeman

+0

वास्तव में, jsfiddle उदाहरण त्रुटि को पकड़ता है, लेकिन यदि आप अपना कंसोल खोलते हैं और इसे चलाते हैं तो यह त्रुटि नहीं पकड़ता है। चूंकि dfreeman इंगित करता है कि ये अलग-अलग त्रुटियां हैं। – andyhasit

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