2012-11-10 16 views
11

मेरे पास नोड.जेएस और एक्सप्रेस में ऐप है। मुझे इसके लिए परीक्षण लिखने की जरूरत है। मुझे एक्सप्रेस ऐप त्रुटियों को संभालने में समस्या है। मुझे यह How do I catch node.js/express server errors like EADDRINUSE? मिला, लेकिन यह मेरे लिए काम नहीं करता है, मुझे नहीं पता क्यों। मैं त्रुटियों को संभालना चाहता हूं, जो व्यक्त हो सकता है जबकि expressApp.listen() निष्पादित कर रहा है (EADDRINUSE, EACCES इत्यादि)।Node.js एक्सप्रेस ऐप हैंडल स्टार्टअप त्रुटियां

express = require('express') 
listener = express() 

#doesn't work for me 
listener.on('uncaughtException', (err) -> 
    #do something 
) 

#doesn't work too 
listener.on("error", (err) -> 
    #do something 
) 

#this works, but it caughts all errors in process, I want only in listener 
process.on('uncaughtException', (err) -> 
    #do something 
) 

listener.listen(80) #for example 80 to get error 

कोई विचार?

+0

' listener.on 'त्रुटि':

listener.listen(80).on('error', function(err) { }); 

क्या listener.listen लेकिन वास्तव में ऐसा एक HTTP सर्वर बना सकते हैं और कहते हैं यह पर सुनने है। क्या यह सामान्य स्टैक ट्रेस और क्रैश करता है भले ही वह रेखा है? – loganfsmyth

+0

हां, अगर मैं यह 'listener.listen (80)' करता हूं तो यह स्टैक ट्रेस और क्रैश प्रिंट करता है।यहां तक ​​कि 'listener.on' त्रुटि ', ...' शायद इस मामले में त्रुटि हुई त्रुटि एक्सप्रेस त्रुटि नहीं है और यही कारण है कि यह संभाल नहीं करता है। लेकिन यह केवल धारणा है। –

उत्तर

20

सबसे पहले, एक्सप्रेसजेएस uncaughtException ईवेंट फेंक नहीं देता है, प्रक्रिया करता है, इसलिए कोई आश्चर्य नहीं कि आपका कोड काम नहीं करता है।

तो इसका उपयोग करें: process.on('uncaughtException',handler) इसके बजाए। ,

app.configure(function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

इस समारोह ग्राहक के लिए एक त्रुटि संदेश देता है वैकल्पिक साथ:

इसके बाद, expressJS पहले से ही त्रुटि हैंडलिंग, इस उद्देश्य के लिए मिडलवेयर समारोह प्रदान करता है का उपयोग करने के रूप में है, जिनमें से एक मानक साधन प्रदान करता है stacktrace, और connectJS errorHandler पर प्रलेखित है।

(ध्यान दें कि errorHandler वास्तव में connectJS का हिस्सा है और केवल expressJS से सामने आ रहा है।)

व्यवहार मौजूदा errorHandler प्रदान करता है आपकी आवश्यकताएं पूरी करने, उसके स्रोत connectJS's errorHandler middleware पर स्थित है नहीं है और आसानी से संशोधित किया जा सकता है, तो अपनी जरूरतों के अनुसार।

var myErrorHandler = function(err, req, res, next){ 
    ... 
    // note, using the typical middleware pattern, we'd call next() here, but 
    // since this handler is a "provider", i.e. it terminates the request, we 
    // do not. 
}; 

और स्थापित:

बेशक, बल्कि इस समारोह प्रत्यक्ष रूप से बदलाव से

, "सही" तरीका यह है के रूप में, अपने स्वयं के errorHandler बनाने के लिए, एक प्रारंभिक बिंदु के रूप connectJS संस्करण का उपयोग कर रहा है

app.configure(function(){ 
    app.use(myErrorHandler); 
}); 

एक अच्छी तरह से लिखा ट्यूटोरियल के लिए filter और provider मिडलवेयर और How To Write Middleware for Connect/Express की connectJS के विचार के लिए स्पष्टीकरण Just Connect it, Already देखें: के रूप में expressJS में।

आप भी इन उपयोगी लग सकते:

अंत में, परीक्षण expressJS के बारे में जानकारी का बहुत अच्छा स्रोत its own tests.

+0

+1, बहुत अच्छा जवाब! – Menztrual

+0

इतनी विस्तृत व्याख्या के लिए धन्यवाद, यह वैसे भी उपयोगी होगा। वेब अनुरोध संभालने के दौरान मुझे त्रुटियों को संभालने की आवश्यकता नहीं है। मुझे सर्वर बनाने और app.listen (...) पर कॉल करने की आवश्यकता है। अब मैं समझता हूं कि यहां नोड.जेएस त्रुटियों की हैंडलिंग की आवश्यकता है, एक्सप्रेस में मिडलवेयर नहीं। process.on ('uncaughtException', हैंडलर) मेरे मामले में स्वीकार्य है। –

+0

@Piane_Ramso, फिर हां, अपने स्वयं के ईवेंट हैंडलर को 'process.on (' uncaughtException ') में जोड़ना निश्चित रूप से जाने का तरीका है। यदि आप उत्सुक हैं, अंतर्निहित कोड जो [node.cc] में [# नज़दीकी) लाइन # 1739 (https://github.com/joyent/node/blob/master/src/ पर स्थित "uncaught" अपवादों को संसाधित करता है node.cc) –

57
में पाया जा सकता

इस चाल करना चाहिए: ... `काम करना चाहिए

app.listen = function(){ 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
}; 
+10

यह अविश्वसनीय है कि यह सबसे सरल और सही उत्तर है, और इसमें कोई अपवर्त नहीं है! चाल यह समझना है कि वेब सर्वर ऑब्जेक्ट app.listen द्वारा वापस किया जाता है। मैं इसका उपयोग करता हूं: '' 'app.listen (80, फ़ंक्शन() { console.log ('सफलता'); })। ('त्रुटि', फ़ंक्शन (त्रुटि) { अगर (err.errno === 'EADDRINUSE') { console.log ('पोर्ट व्यस्त'); } अन्य { console.log (err); } }); '' –

+0

मुझे समझ में नहीं आता कि आपका कोड कर रहा है। यदि आप ऐप को कॉल कर रहे हैं .listen नोड पहले से ही http.createServer को हुड के नीचे करता है या मैंने मूल रूप से मूल ऐप .listen() विधि को ओवरराइड कर दिया है और इसे अपने कोड के साथ ओवरराइड कर रहे हैं? – PositiveGuy

+0

कोड की पहली पंक्ति का उपयोग किया जाना चाहिए, बाकी सब कुछ यह बताता है कि यह क्यों काम करता है। –

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