2012-12-29 11 views
7

में एररलाइजिंग त्रुटि को संभालने में मैंने हाल ही में एक एक्सप्रेस.जेएस आधारित एप्लिकेशन पर काम करना शुरू किया, जो पीजी मॉड्यूल (https://github.com/brianc/node-postgres)एक्सप्रेस.जेएस-आधारित ऐप

का भी उपयोग करता है

मैंने भी काफी समय बिताया, नोड और एक्सप्रेस दृष्टिकोण त्रुटि प्रबंधन, सही तरीके से डिजाइन करने के फायदे मिडलवेयर इत्यादि के बारे में पढ़ना, फिर भी, एक आवर्ती समस्या अभी भी समाधान के बिना मुझे परेशान कर रही है।

app.get("/:someThing/:someId", function(req, res, next) { 
    pgClient.query("some SQL query", function(err, data) { 
    if (err) { return next(err); } // some 500 handler will take it 
    if (data.rows.length == 0) { 
     next(); // send it over to a 404 handler 
    } 

    //finally, here we get the chance to do something with the data. 
    //and send it over via res.json or something else 
    }); 
}); 

मैं सही ढंग से पढ़ा है, तो यह यह करने के लिए उचित तरीके से किया जाना चाहिए:

कहो, मैं निम्नलिखित रूटर विधि है। फिर भी, मैं शर्त लगाता हूं कि आप यह भी स्वीकार कर सकते हैं कि बॉयलरप्लेट का बहुत अधिक बार-बार लिखना है ... और फिर भी, उसी राउटर विधि में भी, यदि हमारे पास कई नेस्टेड कॉलबैक हैं।

मैं खुद से पूछ रहा हूं कि इस तरह की स्थिति को केंद्रीय रूप से संभालने का सबसे अच्छा तरीका क्या होगा। मेरे सभी विचारों में pgClient.query विधि को अवरुद्ध करना शामिल है। एक में, क्वेरी विधि कॉलबैक पर पास करने के बजाय त्रुटि को फेंक देगी। दूसरे में, pgClient.query पर कॉल राउटर विधि को pgClient के बगल में भेज देगा। फिर अवरुद्ध क्वेरी विधि को पता चलेगा कि अगली बीत जाने के साथ कैसे निपटें।

जो मुझे पता है, उससे त्रुटियों को फेंकना वास्तव में 500 हैंडलर तक पहुंचने का उचित तरीका नहीं है। दूसरी तरफ, पीजी क्लाइंट के विकल्प के रूप में पासिन, उपरोक्त परतों के बारे में बहुत कम स्तर प्रदान करता है, जो मेरे ज्ञान और अनुभव के आधार पर युग्मन का कारण बन सकता है, और यह भी बहुत अच्छा नहीं है।

आप क्या सुझाव देते हैं?

+0

'/: कुछ /: someId'? –

+0

हां, मैंने इसे – user1219569

+0

नहीं बदला, मैंने सभी 500 अनुरोधों के लिए एक मार्ग के बारे में सोचा। –

उत्तर

11

आप connect-domain मिडलवेयर का उपयोग कर सकते हैं। यह connect और express के साथ काम करता है और Doman एपीआई पर आधारित है।

आपको connect-domain मिडलवेयर को स्टैक में पहले मिडलवेयर के रूप में जोड़ने की आवश्यकता है। बस इतना ही। अब आप अपने एसिंक कोड में हर जगह त्रुटियों को फेंक सकते हैं और उन्हें डोमेन मिडलवेयर के साथ संभाला जाएगा और त्रुटि हैंडलर व्यक्त करने के लिए पारित किया जाएगा।

सरल उदाहरण:

// Some async function that can throw error 
var asyncFunction = function(callback) { 
    process.nextTick(function() { 
     if (Math.random() > 0.5) { 
      throw new Error('Some error'); 
     } 
     callback(); 
    }); 
}; 

var express = require('express'); 
var connectDomain = require('connect-domain'); 

var app = express(); 
app.use(connectDomain()); 
// We need to add router middleware before custom error handler 
app.use(app.router); 

// Common error handler (all errors will be passed here) 
app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.send(500, 'Something broke!'); 
}); 

app.listen(3131); 

// Simple route 
app.get('/', function(req, res, next) { 
    asyncFunction(function() { 
     res.send(200, 'OK'); 
    }); 
}); 

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