अनचाहे अपवादों के साथ कुछ भी फैंसी करने की कोशिश न करें। सर्वर मरने दें।
आम तौर पर, यदि एक मार्ग हैंडलर अपवाद फेंकता है, तो एक्सप्रेस बस इसे पकड़ लेगा और क्लाइंट को HTTP 500 वापस कर देगा। चूंकि एक्सप्रेस ने अपवाद पकड़ा, आपका सर्वर क्रैश नहीं होगा।
आमतौर पर ऐसा होता है कि सर्वर को लाता है जब कॉलबैक के अंदर एक अपवाद फेंक दिया जाता है; उदाहरण के लिए:
app.get('/foo', function(req, res) {
db.query(..., function(err, r) {
throw new Error(); // oops, we'll crash
});
});
क्योंकि कॉलबैक स्वाभाविक रूप से एक्सप्रेस रूटर कॉल स्टैक बाहर कार्यान्वित करता है, वहाँ यह एक विशेष अनुरोध के साथ संबद्ध करने के लिए कोई रास्ता नहीं है। हालांकि, अगर आप ऐसी स्थिति से बचाव कर सकते हैं:
app.get('/foo', function(req, res, next) {
db.query(..., function(err, r) {
try {
throw new Error();
} catch(ex) {
next(ex);
}
});
});
एक्सप्रेस 'next
समारोह इसके पहले तर्क के रूप में एक त्रुटि लेता है। यदि आपको कोई त्रुटि तर्क के साथ next
फोन है, यह प्रसंस्करण मार्गों बंद हो जाएगा और एक error handler के लिए देखो, या सिर्फ एक 500
बेशक
लौटने के लिए, try
/catch
में सब कुछ लपेटकर शायद overkill है; ज्यादातर चीजें वास्तव में अपवाद फेंक नहीं देती हैं। आपको केवल यह करना चाहिए यदि आप जानते हैं कुछ फेंक सकता है। अन्यथा, आप अपवादों को निगल कर असंगत स्थिति को डीबग करना बहुत कठिन हो सकते हैं।
यह याद रखना महत्वपूर्ण है कि एक बार अप्रत्याशित अपवाद फेंक दिया जाता है, तो आपका आवेदन एक अनिर्धारित स्थिति में है। यह संभव है कि समस्या का अनुरोध कभी पूरा नहीं होगा, और आपका ऐप कभी भी पुनरारंभ नहीं होगा। या किसी अन्य अजीब चीजें हो सकती हैं। (क्या यह एक डेटाबेस मुद्दा था? फाइल सिस्टम? दूषित स्मृति?)
इस तरह की स्थितियों का निदान करने के लिए अविश्वसनीय रूप से मुश्किल है, बहुत कम डीबग। यह तेजी से और दुर्घटनाग्रस्त होने के लिए सुरक्षित और तर्कसंगत रूप से बेहतर है, और सर्वर को जल्दी से पुनरारंभ करें। हां, कनेक्ट होने वाले किसी भी ग्राहक काट दिया जाएगा, लेकिन उनके लिए बस पुनः प्रयास करना आसान है।
यदि आप उपलब्धता के बारे में चिंतित हैं, तो cluster module का उपयोग करें ताकि आपके पास कई (आमतौर पर CPU कोर की संख्या) सर्वर प्रक्रियाएं चल रही हों, और एक क्रैशिंग पूरी साइट को नीचे नहीं लाएगी।
यह एक महान स्पष्टीकरण है। एक बात मैं अभी भी अस्पष्ट हूं हालांकि। 'यह याद रखना महत्वपूर्ण है कि एक बार अप्रत्याशित अपवाद फेंक दिया जाता है, तो आपका आवेदन एक अनिर्धारित स्थिति में है। यह संभव है कि समस्या का अनुरोध कभी पूरा नहीं होगा, और आपका ऐप कभी भी पुनरारंभ नहीं करेगा। यह ऐसा लगता है जैसे मुझे ऐप नहीं कहना चाहिए।बंद करे(); प्रक्रिया 'बाहर निकलें' पर। सच? – lostintranslation
'प्रक्रिया' 'निकास' हैंडलर में 'app.close()' को कॉल करना व्यर्थ है: [दस्तावेज़ कहते हैं] (http://nodejs.org/api/process.html#process_event_exit) * "मुख्य ईवेंट लूप होगा 'बाहर निकलें' कॉलबैक खत्म होने के बाद अब नहीं चलाया जा सकता है। "* दूसरे शब्दों में, 'निकास' घटना आपको प्रक्रिया को बता रही है ** ** आपके फ़ंक्शन रिटर्न के बाद ** समाप्त हो जाएगी। नेटवर्क श्रोता बंद करना व्यर्थ है क्योंकि कोई अगला टिक नहीं है; आने वाले कनेक्शन को स्वीकार करने के लिए कोड को चलाने का अवसर कभी नहीं होगा। – josh3736
भयानक, धन्यवाद! – lostintranslation