2013-04-07 5 views
7

लटकता है मैंने node.js में एक मॉड्यूल लिखा है जो कुछ नेटवर्क ऑपरेशन करता है। मैंने एक छोटी सी लिपि लिखी जो इस मॉड्यूल का उपयोग करती है (नीचे check परिवर्तनीय)। ऐसा लगता है:node.js: प्रोग्राम या तो अप्रत्याशित रूप से बाहर निकलता है या बस

check(obj, function (err, results) { 
    // ... 
    console.log("Check completed"); 
}); 

अब दिलचस्प बात है। जब यह कोड mocha परीक्षण के भाग के रूप में निष्पादित होता है, तो परीक्षण अपेक्षा के अनुसार बाहर निकलता है। मैं लॉग स्टेटमेंट मुद्रित देखता हूं और प्रक्रिया निकलती है।

जब कोड को स्टैंडअलोन नोड स्क्रिप्ट के रूप में निष्पादित किया जाता है, तो लॉग स्टेटमेंट मुद्रित हो जाता है, लेकिन प्रक्रिया बस लटकती है।

जब मैं इसे डीबग करने का प्रयास करता हूं और मैं --debug-brk का उपयोग कर प्रोग्राम शुरू करता हूं और node-inspector का उपयोग करता हूं, तो यह जल्दी से निकलता है! मुझे लगता है कि process.on 'exit' कहा जाता है। यह निकलता है जबकि मॉड्यूल के भीतर कुछ आंतरिक कॉलबैक अभी तक नहीं बुलाए गए थे। तो ऊपर लॉग कथन या तो मुद्रित नहीं है।

मैं अब अटक गया हूं और मुझे यकीन नहीं है कि यह क्यों हो रहा है। क्या किसी ने भी समान व्यवहार देखा है?

उत्तर

11

जब आप इसे एक स्क्रिप्ट के रूप में चलाते हैं और यह "पूर्ण" होने पर लटकता है, तो इसका मतलब है कि नोड में अभी भी घटनाओं के लिए प्रतीक्षा कॉलबैक पंजीकृत है। नोड को पता नहीं है कि उन घटनाओं को और आग नहीं लगेगी। यदि आप जानते हैं कि बाहर निकलने का समय है, तो आप या तो process.exit() पर कॉल कर सकते हैं, या आप सब कुछ स्पष्ट रूप से बंद/अनबिंड/डिस्कनेक्ट कर सकते हैं (नेटवर्क कनेक्शन, डीबी कनेक्शन इत्यादि)। यदि आप सब कुछ ठीक से बंद करते हैं, तो नोड को बाहर निकलना चाहिए।

मॉड्यूल wtfnode (नाथन आर्थर ने उल्लेख किया है) या why-is-node-running वास्तव में सहायक ट्रैकिंग इस नीचे हो सकता है।

+5

क्या पता लगाने के लिए कोई रास्ता नहीं है कि नोड को क्या खोल रहा है? – Aishwar

+4

यदि आपके पास नोड-इंस्पेक्टर है और प्रक्रिया से जुड़ा हो सकता है और शायद नोड के ईवेंट लूप कोड में ब्रेक पॉइंट सेट कर सकता है। मैंने इनमें से किसी एक को सफलतापूर्वक ट्रैक नहीं किया है। यह या तो स्पष्ट चीजें हैं जैसे डीबी कनेक्शन खोलना, लेकिन इसे स्पष्ट रूप से बंद नहीं करना, या मैं सिर्फ 'process.exit()' करता हूं और अपने जीवन के साथ आगे बढ़ता हूं। –

+6

process._getActive हैंडल() और process._getActiveRequests() http://stackoverflow.com/questions/17960452/how-can-i-get-a-list-of-callbacks-in-the-node-work-queue देखें -या-क्यों-wont-node-ex – aaron

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

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