2013-10-30 9 views
10

कोशिश कर सकता हूं क्या domain या trycatchsee trycatch info here में express.js के माध्यम से आने वाले प्रत्येक अनुरोध को लपेटना संभव है?मैं किसी डोमेन में प्रत्येक एक्सप्रेस जेएस अनुरोध को कैसे लपेट सकता हूं या

मैं एक 'कैच ऑल' बनाने की कोशिश कर रहा हूं (एक्सप्रेस त्रुटि हैंडलर मिडलवेयर एसिंक कॉल नहीं पकड़ता है) यह सुनिश्चित करने के लिए कि मेरी याद आती है कि किसी भी त्रुटि को उपयोगकर्ता को 500 भेजा जा रहा है।

यदि आपके पास एसिंक्रोनस फ़ंक्शन कॉल (उदाहरण के लिए process.nextTick()) है, तो यह एक्सप्रेस 'त्रुटि हैंडलर के दायरे से बाहर होगा, इस प्रकार प्रक्रिया को पूरी तरह से मार देगा। इस प्रकार, एक्सप्रेस त्रुटि हैंडलर का उपयोग सभी मामलों में काम नहीं करेगा।

उत्तर

8

एक्सप्रेस में पहले से ही त्रुटि हैंडलर कार्यान्वयन है। यह connect से इसका उत्तराधिकारी है। इसका उपयोग करने के लिए आपको इसे अंतिम मिडलवेयर बिंदु (अंतिम ऐप.यूज (...) कॉल के रूप में जोड़ने की आवश्यकता है)। उदाहरण के लिए:

var express = require('express') 
    , app = express(); 

app.use(app.router); 
app.use(express.errorHandler()); 

// app.get(...), app.post(...), app.listen(...), etc. 

आप साधारण 500 प्रतिक्रिया कोड वाला सभी त्रुटियों को हैंडल करना चाहते हैं, तो आप express.errorHandler() आप खुद समारोह के साथ बदल सकते थे। उस मामले में अपने कोड इच्छा लगता है:

var express = require('express') 
    , app = express(); 

app.use(app.router); 
app.use(function(err, req, res, next){ 
    if (!err) return next(); 
    res.send(500); 
}); 

// app.get(...), app.post(...), app.listen(...), etc. 

कि जिस तरह से के बारे में अधिक जानकारी कोड में express error example टिप्पणी में पाया जा सकता है

अद्यतन:

बेशक

आप प्रत्येक अनुरोध के लिए डोमेन इस्तेमाल कर सकते हैं । आप प्रत्येक अनुरोध को अलग से लपेट सकते हैं या सभी अपवादों को संभालने के लिए राउटर के लिए रैपिंग का उपयोग कर सकते हैं। कोड पीछा कर रहा है:

var express = require('express') 
    , http = require('http') 
    , app = express() 
    , domain = require('domain'); 

//app.use(app.router); 
app.use(function(req, res, next){ 
    var d = domain.create(); 
    d.on('error', function(er) { 
     console.log('error, but oh well', er.message); 
     res.send(500); 
    }); 

    // explicitly add req and res 
    d.add(req); 
    d.add(res); 

    d.run(function() { 
     app.router(req, res, next); 
    }); 
}); 

app.get('/', function(req,res){ 
    process.nextTick(function(){ 
     throw new Error('Check Error'); 
    }); 
}); 

http.createServer(app).listen(3000, function(){ 
    console.log('Express server listening on port 3000'); 
}); 

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

लीकिंग की निगरानी करने के लिए आप this article से तकनीक का उपयोग कर सकते हैं।

अद्यतन 2:

मैं बस नहीं छोड़ सकते इस खत्म नहीं। trycatch कोड:

var express = require('express') 
    , http = require('http') 
    , app = express() 
    , domain = require('domain') 
    , trycatch = require('trycatch'); 

//app.use(app.router); 
app.use(function(req, res, next){ 
    trycatch(function(){ 
      app.router(req, res, next); 
     }, function(er){ 
      console.log(er.message); 
      res.send(500); 
     }); 
}); 

app.get('/', function(req,res){ 
    process.nextTick(function(){ 
     throw new Error('Check Error'); 
    }); 
}); 

http.createServer(app).listen(3000, function(){ 
    console.log('Express server listening on port 3000'); 
}); 

मैं trycatch के स्रोत की समीक्षा की थी और कोई कोई जादू नहीं था। यह अभी भी लीक का कारण बनता है। trycatch में हुड के नीचे domain है।

+1

क्षमा करें, इसमें सभी मामलों को शामिल नहीं किया गया है। मैं इस सवाल को संपादित करने के लिए संपादित कर दूंगा कि मैंने इसे पहले ही माना है। यदि आपके पास एसिंक्रोनस फ़ंक्शन कॉल है (उदाहरण के लिए process.nextTick()), तो यह एक्सप्रेस 'त्रुटि हैंडलर के दायरे से बाहर होगा, इस प्रकार प्रक्रिया को पूरी तरह से मार देगा। ऐसी समस्याएं हैं जो '' 'डोमेन''' और '' trycatch''' मॉड्यूल हैं जो इस समस्या को कम करती हैं, लेकिन मुझे यकीन नहीं है कि किसी डोमेन या trycatch में एक एक्सप्रेस अनुरोध को कैसे लपेटें। – bzuillsmith

+0

मैंने अपना जवाब अपडेट कर दिया है। बेशक आप कर सकते थे, लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है। शायद आप शटडाउन में अनुकूलन का उपयोग करना चाहेंगे और कुछ [हमेशा के लिए] (https: // github।कॉम/नोडजित्सु/हमेशा के लिए) अपनी स्क्रिप्ट को लगातार चलाने के लिए – andbas

+0

ट्राइकैच लीक और अन्य समस्याओं को रोकने के लिए कोर लाइब्रेरीज़ में बहुत अधिक शर्मनाक करता है। कोड के लिए धन्यवाद। सुनिश्चित नहीं है कि मैं कोशिश कर सकता हूं कि मैं कोशिश कर सकता हूं लेकिन मुझे लगता है कि मैं ट्राइककैच रेपो – bzuillsmith

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