मेरा उपयोग-मामला कस्टम JSON त्रुटि संदेश भेज रहा है, क्योंकि मैं अपने REST API को शक्ति के लिए उपयोग कर रहा हूं। मुझे लगता है कि यह काफी सामान्य परिदृश्य है, इसलिए मेरे जवाब में इस पर ध्यान दिया जाएगा।
लघु संस्करण:
एक्सप्रेस त्रुटि से निपटने
तीन के बजाय चार तर्कों को छोड़कर अन्य मिडलवेयर की तरह त्रुटि से निपटने वाले मिडलवेयर को परिभाषित करें, विशेष रूप से हस्ताक्षर (इरेट, रीक, रेस, नेक्स्ट) के साथ। ... आप अन्य app.use () और मार्गों कॉल के बाद, त्रुटि से निपटने वाले मिडलवेयर को परिभाषित करते हैं
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
});
कोड के किसी भी बिंदु से त्रुटियों को उठाएं:
var JSONError = require('./JSONError');
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
दीर्घ संस्करण
त्रुटि फेंकने का विहित तरीका है:
var err = new Error("Uh oh! Can't find something");
err.status = 404;
next(err)
डिफ़ॉल्ट रूप से, एक्सप्रेस इसे संभालकर बड़े करीने से इसे 404 कोड के साथ HTTP रिस्पॉन्स के रूप में पैकेजिंग करता है, और स्टैक ट्रेस के साथ संलग्न संदेश स्ट्रिंग से मिलकर शरीर।
यह मेरे लिए तब काम नहीं करता है जब मैं एक्सप्रेस का उपयोग REST सर्वर के रूप में कर रहा हूं, उदाहरण के लिए। मैं चाहता हूँ कि त्रुटि HTML के रूप में नहीं, JSON के रूप में वापस भेजी जाए। मैं निश्चित रूप से मेरे स्टैक ट्रेस को अपने क्लाइंट के लिए नहीं ले जाना चाहता।
मैं JSON का उपयोग करके एक प्रतिक्रिया के रूप में भेज सकता हूं req.json()
, जैसे। की तरह कुछ req.json({ status: 404, message: 'Uh oh! Can't find something'})
। वैकल्पिक रूप से, मैं स्थिति कोड का उपयोग करके सेट कर सकता हूं req.status()
। दो का मेल:
req.status(404).json({ status: 404, message: 'Uh oh! Can't find something'});
यह एक आकर्षण की तरह काम करता है। उस ने कहा, मुझे हर बार टाइप करने में काफी अस्वाभाविक लगता है, और कोड हमारे जैसा नहीं next(err)
था। यह एक सामान्य (यानी, मान्य) प्रतिक्रिया JSON को कैसे भेजा जाता है, इसके समान है। इसके अलावा, विहित दृष्टिकोण द्वारा फेंकी गई किसी भी त्रुटि का परिणाम अभी भी HTML आउटपुट में है।
यह वह जगह है जहां मिडलवेयर से निपटने में एक्सप्रेस की त्रुटि आती है। मेरे मार्गों के हिस्से के रूप में, मैं परिभाषित करता हूं:
app.use(function(err, req, res, next) {
console.log('Someone tried to throw an error response');
});
मैं भी एक कस्टम JSONError वर्ग में त्रुटि उपवर्ग:
JSONError = function (status, message) {
Error.prototype.constructor.call(this, status + ': ' + message);
this.status = status;
this.message = message;
};
JSONError.prototype = Object.create(Error);
JSONError.prototype.constructor = JSONError;
अब, जब मैं कोड में एक त्रुटि फेंकना चाहता हूँ, मैं करता हूँ:
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
मिडिलवेयर को संभालने वाली कस्टम त्रुटि पर वापस जाकर, मैं इसे संशोधित करता हूं:
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
}
JSONError में सबक्लासिंग एरर महत्वपूर्ण है, क्योंकि मुझे संदेह है कि एक सामान्य हैंडलर या एक एरर हैंडलर को लागू करने के लिए यह निर्धारित करने के instanceof Error
लिए एक्सप्रेस पहले पैरामीटर पर एक चेक करता है next()
। मैं instanceof JSONError
चेक को हटा सकता हूं और अप्रत्याशित त्रुटियां (जैसे कि दुर्घटना) सुनिश्चित करने के लिए मामूली संशोधन भी कर सकता हूं, जो JSON प्रतिक्रिया देता है।