2012-08-08 14 views
22

के साथ समस्या निवारण में मैं एक पूर्ण नोडजेएस शुरुआती हूं और एक्सप्रेस और मोंगोस के साथ एक साधारण आरईएसटी-वेबसाइट सेवा बनाना चाहता हूं।मोंगोस

एक केंद्रीय स्थान पर मोंगोस की त्रुटियों को संभालने का सबसे अच्छा अभ्यास क्या है?

जब कहीं भी एक डेटाबेस त्रुटि तब होती है मैंने एक त्रुटि संदेश के साथ एक HTTP-500-त्रुटि-पृष्ठ लौटना चाहते:

if(error) { 
    res.writeHead(500, {'Content-Type': 'application/json'}); 
    res.write('{error: "' + error + '"}'); 
    res.end(); 
} 

वर्ष ट्यूटोरियल http://blog-next-stage.learnboost.com/mongoose/ मैं के बारे में पढ़ा एक वैश्विक त्रुटि श्रोता में:

Mongoose.addListener('error',function(errObj,scope_of_error)); 

लेकिन यह काम नहीं कर रहा है और मुझे इस श्रोता के बारे में official Mongoose documentation में कुछ नहीं मिला। क्या मैंने प्रत्येक मोंगो अनुरोध के बाद त्रुटियों की जांच की है?

उत्तर

40

यदि आप एक्सप्रेस का उपयोग कर रहे हैं, तो त्रुटियों को आम तौर पर सीधे आपके मार्ग में या मोंगोस के शीर्ष पर बने एपीआई के भीतर, next के साथ त्रुटि को अग्रेषित करने के लिए सीधे किया जाता है।

app.get('/tickets', function (req, res, next) { 
    PlaneTickets.find({}, function (err, tickets) { 
    if (err) return next(err); 
    // or if no tickets are found maybe 
    if (0 === tickets.length) return next(new NotFoundError)); 
    ... 
    }) 
}) 

NotFoundError अपने error handler middleware में सूंघा जा सकता है अनुकूलित संदेश सेवा प्रदान करने के लिए।

कुछ अमूर्तता संभव है लेकिन आपको मार्ग श्रृंखला के नीचे त्रुटि को पारित करने के लिए अभी भी next विधि तक पहुंच की आवश्यकता होगी।

PlaneTickets.search(term, next, function (tickets) { 
    // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node 
}) 

केंद्रीय रूप से मोंगोज़ त्रुटियों को संभालने के लिए, वास्तव में सभी को संभालने के लिए वास्तव में एक स्थान नहीं है। त्रुटियाँ कई विभिन्न स्तरों पर नियंत्रित किया जा सकता:

connection त्रुटियों connection अपने मॉडल पर उत्सर्जित होते हैं का उपयोग कर रहे हैं, इसलिए

mongoose.connect(..); 
mongoose.connection.on('error', handler); 

// or if using separate connections 
var conn = mongoose.createConnection(..); 
conn.on('error', handler); 

ठेठ प्रश्नों के लिए/अद्यतन के लिए/निकालता है त्रुटि अपने कॉलबैक करने के लिए पारित कर दिया है।

PlaneTickets.find({..}, function (err, tickets) { 
    if (err) ... 

आप एक कॉलबैक त्रुटि मॉडल पर उत्सर्जित होता है उत्तीर्ण नहीं होते हैं, तो आप इसके लिए सुन रहे हैं:

PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request! 
ticket.save(); // no callback passed 

आप एक कॉलबैक उत्तीर्ण नहीं होते हैं और बात नहीं सुन रहे हैं model स्तर पर त्रुटियां वे मॉडल connection पर उत्सर्जित की जाएंगी।

यहां की कुंजी लेना यह है कि आप next तक किसी भी तरह से त्रुटि को पारित करने के लिए उपयोग करना चाहते हैं।

+0

धन्यवाद, आपका सहायक उत्तर मेरे लिए त्रुटि प्रबंधन के बारे में बहुत कुछ स्पष्ट करता है। – Sonson123

+0

महान जवाब! विशेष रूप से ExpressJS की त्रुटि हैंडलिंग मिडलवेयर में टाई करने के लिए अगले() का उपयोग करने के बारे में सुझाव। –

+0

यह mongoose.connection.on ('त्रुटि', हैंडलर) के साथ काम नहीं करता है; या conn.on ('त्रुटि', हैंडलर); मेरे लिए, मैंने हैंडलर को एक फ़ंक्शन के रूप में परिभाषित किया है जो console.log() पहला तर्क है लेकिन सर्वर कंसोल पर कुछ भी नहीं दिखाई देता है। – Vadorequest

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