मैं sbox.io के साथ node.js का उपयोग कर रहा हूं ताकि मेरा वेब पेज टीसीपी सॉकेट द्वारा पेश किए गए चरित्र डेटा तक पहुंच सके। मैं node.js. के लिए काफी नया हूँnode.js - टीसीपी सॉकेट त्रुटि को संभालने ECONNREFUSED
उपयोगकर्ता ---->वेब पेज < - (socket.io) ->Node.js < - (टीसीपी) ->टीसीपी सर्वर
कोड शुक्र संक्षिप्त है:
io.on('connection', function (webSocket) {
tcpConnection = net.connect(5558, 'localhost', function() {});
tcpConnection.on('error', function(error) {
webSocket.emit('error', error);
tcpConnection.close();
});
tcpConnection.on('data', function(tcpData) {
webSocket.emit('data', { data: String.fromCharCode.apply(null, new Uint8Array(tcpData))});
});
});
यह सब सामान्य मामले में बस ठीक काम करता है, लेकिन मैं गारंटी नहीं दे सकते कि TCP सर्वर वहाँ हर समय हो जाएगा। जब ऐसा नहीं होता है, तो टीसीपी स्टैक ECONNREFUSED को node.js पर लौटाता है - यह पूरी तरह से अपेक्षित है और मुझे इसे शानदार तरीके से संभालने की आवश्यकता है। वर्तमान में, मैं देखता हूं:
events.js:72
throw er; // Unhandled 'error' event
^
Error: connect ECONNREFUSED
at errnoException (net.js:904:11)
at Object.afterConnect [as oncomplete] (net.js:895:19)
... और पूरी प्रक्रिया समाप्त होती है।
मैंने इसके समाधान के लिए बहुत सी खोज की है; अधिकांश हिट प्रोग्रामर से पूछते हैं कि क्यों पहले ECONNREFUSED प्राप्त हुआ है - और सलाह यह सुनिश्चित करने के लिए है कि टीसीपी सर्वर उपलब्ध है। विफलता मामलों को संभालने की कोई चर्चा नहीं।
यह पोस्ट - Node.js connectListener still called on socket error - उपरोक्त कोड में किए गए 'त्रुटि' ईवेंट के लिए हैंडलर जोड़ने का सुझाव देता है। यह बिल्कुल ठीक है कि मैं इसे कैसे काम करना चाहूंगा ... सिवाय इसके कि यह मेरे लिए नहीं है (मेरे लिए), मेरा प्रोग्राम ECONNREFUSED को फंस नहीं पड़ता है।
मैंने आरटीएफएम की कोशिश की है, और http://nodejs.org/api/net.html#net_event_error_1 पर node.js दस्तावेज़ों का सुझाव है कि वास्तव में एक 'त्रुटि' घटना है - लेकिन इसका उपयोग करने के लिए थोड़ा संकेत दें।
अन्य समान एसओ पदों (जैसे कि Node.js Error: connect ECONNREFUSED) के उत्तर वैश्विक वैश्विक अपवाद हैंडलर की सलाह देते हैं, लेकिन यह मेरे लिए एक खराब समाधान की तरह लगता है। यह मेरा प्रोग्राम खराब कोड के कारण अपवाद फेंकने वाला नहीं है, यह ठीक काम कर रहा है - यह बाहरी विफलताओं को संभालने वाला है क्योंकि इसे डिज़ाइन किया गया है।
तो
- क्या मैं सही हूँ तरीके से इस आ? (यह स्वीकार करने में प्रसन्नता है कि यह एक नौसिखिया त्रुटि है)
- क्या ऐसा करना संभव है जो मैं करना चाहता हूं, और यदि हां, तो कैसे?
ओह, और:
$ node -v
v0.10.31
समस्या में होने की संभावना है: 'tcpConnection = शुद्ध
, बस करने के लिए पूरे त्रुटि वस्तु में 'समस्या' परिणाम socket.io सॉकेट के माध्यम से वेब पृष्ठ पर वापस ऊपर प्रेषित किया जा रहा घटना का नाम बदलने। कनेक्ट करें (5558, 'लोकलहोस्ट', फ़ंक्शन() {}); 'कनेक्ट करने में सक्षम नहीं है। कोड में आप बहुत कम कर सकते हैं, आपको यह सुनिश्चित करना होगा कि स्थानीयहोस्ट पर बंदरगाह 5558 वास्तव में खुला और सुन रहा है। – alandarev
मुद्दा यह है कि मैं इसकी गारंटी नहीं दे सकता। तथ्य यह है कि यह लोकहोस्ट पर है एक लाल हेरिंग - कल्पना करें कि यह कुछ दूरस्थ सर्वर पर था जहां कनेक्टिविटी लोकलहोस्ट के रूप में विश्वसनीय नहीं थी। प्रत्येक अन्य प्रोग्रामिंग भाषा आपको त्रुटि को गलती से फंसाने देती है (उदाहरण के लिए सी सेट में कनेक्ट() कनेक्ट करें, जावा में कनेक्ट (सॉकेट एड्रेस) एक IOException, आदि इत्यादि फेंकता है)। –