2014-09-15 14 views
13

मैं 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 
+0

समस्या में होने की संभावना है: 'tcpConnection = शुद्ध

, बस करने के लिए पूरे त्रुटि वस्तु में 'समस्या' परिणाम socket.io सॉकेट के माध्यम से वेब पृष्ठ पर वापस ऊपर प्रेषित किया जा रहा घटना का नाम बदलने। कनेक्ट करें (5558, 'लोकलहोस्ट', फ़ंक्शन() {}); 'कनेक्ट करने में सक्षम नहीं है। कोड में आप बहुत कम कर सकते हैं, आपको यह सुनिश्चित करना होगा कि स्थानीयहोस्ट पर बंदरगाह 5558 वास्तव में खुला और सुन रहा है। – alandarev

+0

मुद्दा यह है कि मैं इसकी गारंटी नहीं दे सकता। तथ्य यह है कि यह लोकहोस्ट पर है एक लाल हेरिंग - कल्पना करें कि यह कुछ दूरस्थ सर्वर पर था जहां कनेक्टिविटी लोकलहोस्ट के रूप में विश्वसनीय नहीं थी। प्रत्येक अन्य प्रोग्रामिंग भाषा आपको त्रुटि को गलती से फंसाने देती है (उदाहरण के लिए सी सेट में कनेक्ट() कनेक्ट करें, जावा में कनेक्ट (सॉकेट एड्रेस) एक IOException, आदि इत्यादि फेंकता है)। –

उत्तर

14

मैं निम्नलिखित कोड भाग गया:

var net = require('net'); 

var client = net.connect(5558, 'localhost', function() { 
    console.log("bla"); 
}); 
client.on('error', function(ex) { 
    console.log("handled error"); 
    console.log(ex); 
}); 

है जैसा कि मैंने 5558 खुला हुआ नहीं, उत्पादन किया गया था:

$ node test.js 
handled error 
{ [Error: connect ECONNREFUSED] 
    code: 'ECONNREFUSED', 
    errno: 'ECONNREFUSED', 
    syscall: 'connect' } 

यह साबित करता है कि त्रुटि को ठीक से संभाला जाता है ... यह सुझाव देता है कि त्रुटि और हो रही है।

webSocket.emit('error', error); 

'त्रुटि' घटना खास है और (यदि ऐसा नहीं है, इस प्रक्रिया को समाप्त होता है) कहीं से संभाला जाना चाहिए:

के रूप में एक और उत्तर में चर्चा की, समस्या वास्तव में इस लाइन है।

बस 'समस्या' या पूरे त्रुटि वस्तु में 'चेतावनी' परिणाम वेब पेज के लिए socket.io सॉकेट अप के माध्यम से वापस प्रेषित किया जा रहा करने के लिए घटना का नाम बदलने:

webSocket.emit('warning', error); 
+0

आप सही हैं, यह ठीक काम करता है - और मुझे वास्तविक समस्या को ट्रैक करने में मदद मिली (मेरे अपने प्रश्न का उत्तर देखें)। धन्यवाद! –

+0

असल में मैं इस त्रुटि को बाईपास करने के लिए एचडब्ल्यू जानना चाहता था? यहां एक प्रश्न पोस्ट किया गया: http://stackoverflow.com/questions/32428693/net-connect-reconnecting-tcp-net-connects-yields-connect-econnrefused – user2290820

2

ठीक है, थोड़ा शर्मनाक यह, पता चला है कि समस्या वास्तव में इस लाइन है:

  • :

    webSocket.emit('error', error); 
    

    मेरे इरादे को किया गया था (जैसे ECONNREFUSED के रूप में)

  • "फिर से फेंक" उन्हें ग्राहक वेब पेज के लिए socket.io सॉकेट के माध्यम से
  • उन्हें वेब पेज में किसी तरह से (में कुछ rework/sanitisation साथ निश्चित रूप से हालांकि संभाल जाल टीसीपी त्रुटियों उपयोगकर्ता को प्रदर्शित करने के लिए कुछ तरीका)

हालांकि 'त्रुटि' घटना विशेष है और कहीं कहीं संभालने की आवश्यकता है (जो मैं नहीं कर रहा था - इसलिए प्रक्रिया समाप्त हो रही है)।

webSocket.emit('problem', error); 
+0

मैं 'समस्या'' का नाम बदलकर' चेतावनी 'करूँगा, शब्द * समस्या * के रूप में तकनीकी नहीं है। साथ ही, यह ईमानदारी से सहायता प्राप्त करने और उपयोग करने के लिए कठोर होने की सीमा रेखा पर है, फिर बस अपना उत्तर सबमिट करें। कृपया एक नज़र डालें: http://stackoverflow.com/tour – alandarev

+0

समझा। आपकी मदद ने मुझे समस्या को हल करने का नेतृत्व किया (जिसके लिए मैं आभारी हूं और यही कारण है कि मैंने इसके लिए धन्यवाद दिया)। जैसा कि होता है, मैंने इस स्थिति में क्या करना है, इस बारे में एसओ शिष्टाचार दस्तावेज़ों को पढ़ा था, लेकिन मुझे एक विशिष्ट उल्लेख (सही करने के लिए खुश) नहीं देखा गया था: समस्या वास्तव में असंबद्ध कोड के कारण एक असंबद्ध समस्या का दुरुपयोग था (दुरुपयोग 'त्रुटि' घटना)। मुझे आपके उत्तर को सही के रूप में चिह्नित करने में खुशी होगी, लेकिन वर्तमान में इसमें वास्तव में मूल समस्या का उत्तर नहीं है, इसलिए मैं इसे स्वीकार नहीं कर सकता। यदि आप इसे संपादित करना चाहते हैं तो ऐसा होता है, मैं इसे मानता हूं! –

+0

आपकी पावती के लिए धन्यवाद। जैसा कि आप पाते हैं वह आपके लिए सबसे अच्छा है। मेरे लिए पहली जगह नाटक शुरू करना भी गलत था। – alandarev

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