परिचय
जब उपयोगकर्ता किसी भी एप्लिकेशन के साथ इंटरैक्ट करते हैं तो अपवाद और त्रुटि होने के लिए बाध्य होते हैं, यह सॉफ्टवेयर इंजीनियरों पर निर्भर है कि वे किसी भी त्रुटि को संभालने के लिए एक साधन का चयन करें जो कि हो सकता है - जाने या अनजाने में। नतीजतन, एक्सप्रेस के साथ एपीआई बनाने वाले बैकएंड डेवलपर्स खुद को यह सुनिश्चित करने के लिए काम कर रहे हैं कि वे एक उपयोगी, कुशल और प्रयोग करने योग्य एपीआई बना रहे हैं। एक मजबूत प्रणाली बनाने के लिए त्रुटियों को इस तरह से संभालना सबसे महत्वपूर्ण है क्योंकि यह विकास के समय, एकमुश्त त्रुटियों, उत्पादकता के मुद्दों को कम करने में मदद करता है और सॉफ्टवेयर विकास की सफलता या मापनीयता को निर्धारित करता है।
क्या आपको त्रुटि संदेश लॉग करने, त्रुटि को दबाने, त्रुटि के बारे में उपयोगकर्ताओं को सूचित करने, या त्रुटियों को संभालने के लिए कोड लिखने की आवश्यकता है? और अधिक आश्चर्य ना करें.
इस गाइड में, हम सीखेंगे कि एक्सप्रेस एप्लिकेशन के लिए एक मजबूत एरर-हैंडलिंग कोडबेस कैसे बनाया जाए, जो एप्लिकेशन त्रुटियों का पता लगाने में मदद करेगा और रनटाइम के दौरान किसी भी एप्लिकेशन को ठीक करने के लिए इष्टतम कार्रवाई करेगा।
नोट: हम अपने डेमो में एपीआई का परीक्षण करने के लिए पोस्टमैन का उपयोग करेंगे। आप इसे पर डाउनलोड कर सकते हैं डाकिया डाउनलोड पृष्ठ. वैकल्पिक रूप से, आप केवल ब्राउज़र, कमांड-लाइन का उपयोग कर सकते हैं curl
उपकरण, या कोई अन्य उपकरण जिससे आप परिचित हों।
एरर हैंडलिंग क्या है?
सॉफ़्टवेयर विकास में, दो अलग-अलग प्रकार के अपवाद हैं: परिचालन और कार्यक्रम संबंधी.
- रनटाइम के दौरान परिचालन विफलताएं उत्पन्न हो सकती हैं, और एप्लिकेशन को अचानक समाप्त होने से रोकने के लिए, हमें इन अपवादों को कुशल त्रुटि प्रबंधन विधियों के माध्यम से संभालना चाहिए।
- एक असाधारण स्थिति उत्पन्न होने पर प्रोग्रामर द्वारा प्रोग्रामेटिक अपवादों को मैन्युअल रूप से फेंक दिया जाता है।
आप परिचालन अपवादों को "अप्रत्याशित, लेकिन पूर्वाभास" अपवादों (जैसे सीमा से बाहर एक सूचकांक तक पहुंच) के रूप में सोच सकते हैं, और प्रोग्रामेटिक अपवादों को "अपेक्षित और पूर्वाभास" अपवादों (जैसे संख्या स्वरूपण अपवाद) के रूप में सोच सकते हैं।
एक्सेप्शन हैंडलिंग वह प्रक्रिया है जिसका उपयोग किसी प्रोग्राम के भीतर खामियों को खोजने और ठीक करने के लिए किया जाता है। त्रुटि प्रबंधन संदेश भेजता है जिसमें उस प्रकार की त्रुटि शामिल होती है जो हुई थी और स्टैक जहां त्रुटि हुई थी।
नोट: कंप्यूटर विज्ञान में, अपवाद पुनर्प्राप्त करने योग्य होते हैं, और आमतौर पर रनटाइम के दौरान या तो परिचालन या प्रोग्रामेटिक मुद्दों से उत्पन्न होते हैं। त्रुटियाँ आमतौर पर बाहरी कारकों से उत्पन्न होती हैं, जैसे हार्डवेयर की सीमाएँ, कनेक्टिविटी के साथ समस्याएँ, स्मृति की कमी, आदि। Error
कक्षा। Error
वर्ग ही त्रुटियों और अपवादों दोनों का प्रतिनिधित्व करता है।
एक्सप्रेस में, अपवाद हैंडलिंग से तात्पर्य है कि सिंक्रोनस और एसिंक्रोनस अपवादों को पकड़ने और संसाधित करने के लिए एक्सप्रेस खुद को कैसे सेट करता है। एक्सप्रेस में अपवाद प्रबंधन के बारे में अच्छी बात यह है कि एक डेवलपर के रूप में, आपको अपने स्वयं के अपवाद संचालकों को लिखने की आवश्यकता नहीं है; एक्सप्रेस एक डिफ़ॉल्ट अपवाद हैंडलर के साथ आता है। अपवाद हैंडलर त्रुटियों की पहचान करने और उन्हें उपयोगकर्ता को रिपोर्ट करने में सहायता करता है। यह विभिन्न उपचारात्मक रणनीतियाँ भी प्रदान करता है और अपवादों को कम करने के लिए उन्हें लागू करता है।
हालांकि ये हुड के नीचे जाने वाली बहुत सी चीजें प्रतीत हो सकती हैं, एक्सप्रेस में अपवाद हैंडलिंग किसी प्रोग्राम की समग्र प्रक्रिया को धीमा नहीं करती है या इसके निष्पादन को रोकती है।
एक्सप्रेस में एक्सेप्शन हैंडलिंग को समझना
एक्सप्रेस के साथ आने वाले डिफ़ॉल्ट त्रुटि हैंडलर के साथ, हमारे हाथ में मिडलवेयर फ़ंक्शंस का एक सेट होता है जो रूट हैंडलर में स्वचालित रूप से त्रुटियों को पकड़ने में मदद करता है। जल्द ही, हम एक एक्सप्रेस ऐप में उचित त्रुटियों को वापस करने और संवेदनशील जानकारी को लीक न करने के तरीके पर सिद्धांत को अभ्यास में लाने के लिए एक परियोजना तैयार करेंगे।
एक्सप्रेस में मिडलवेयर फ़ंक्शन को परिभाषित करना
एरर-हैंडलिंग मिडलवेयर फ़ंक्शंस को इस तरह से परिभाषित किया जाता है कि वे एक को स्वीकार करते हैं Error
object पहले इनपुट पैरामीटर के रूप में, उसके बाद किसी अन्य मिडलवेयर फ़ंक्शन के डिफ़ॉल्ट पैरामीटर: request
, response
, तथा next
। next()
फ़ंक्शन सभी मौजूदा मिडलवेयर को राउटर के लिए अगली त्रुटि हैंडलर पर छोड़ देता है।
एक्सप्रेस में त्रुटि से निपटने की स्थापना
नोड और एक्सप्रेस ऐप बनाने के लिए अपने टर्मिनल में निम्नलिखित कमांड चलाएँ:
$ mkdir error-handling-express
नए बनाए गए फ़ोल्डर में, आइए एक नया नोड प्रोजेक्ट इनिशियलाइज़ करें:
$ cd error-handling-express && npm init -y
यह एक बनाता है package.json
हमारे फोल्डर में फाइल करें।
हमारे नोड ऐप में एक एक्सप्रेस सर्वर बनाने के लिए, हमें इंस्टॉल करना होगा express
पैकेज dotenv
पर्यावरण चर को स्वचालित रूप से लोड करने के लिए .env
में फ़ाइल करें process.env
वस्तु, और nodemon
यदि निर्देशिका में फ़ाइल परिवर्तन नोट किया जाता है तो नोड ऐप को पुनरारंभ करने के लिए।
$ npm install express dotenv nodemon
अगला, एक बनाएँ app.js
प्रोजेक्ट फ़ोल्डर में फ़ाइल जो ऐप के लिए इंडेक्स फ़ाइल के रूप में काम करेगी।
अब जब हमने अपने एक्सप्रेस ऐप के लिए सभी आवश्यक निर्भरताएँ स्थापित कर ली हैं, तो हमें ऐप को पढ़ने के लिए स्क्रिप्ट सेट करने की आवश्यकता है package.json
फ़ाइल। इसे प्राप्त करने के लिए, package.json
फ़ाइल, ताकि scripts
वस्तु जैसा नीचे दिखाया गया है:
"scripts": {
"start": "nodemon app.js"
},
वैकल्पिक रूप से, आप उपयोग करना छोड़ सकते हैं nodemon
, और उपयोग करें node app.js
बजाय.
एक एक्सप्रेस सर्वर की स्थापना
सर्वर सेट अप करने के लिए, हमें पहले विभिन्न पैकेजों को आयात करना होगा app.js
. हम एक भी बनाएंगे .env
प्रोजेक्ट डायरेक्टरी में फाइल - एप्लिकेशन के लिए सभी पर्यावरण चर को स्टोर करने के लिए:
const express = require('express')
require('dotenv').config
PORT=4000
हमने ऐप के लिए पोर्ट नंबर को परिभाषित किया है .env
, जिसे लोड किया जाता है और इसके द्वारा पढ़ा जाता है dotenv
, और बाद में पहुँचा जा सकता है।
एक्सप्रेस सर्वर को प्रारंभ करना
अब, हमें एक्सप्रेस सर्वर को इनिशियलाइज़ करने और टेस्ट रूट के अनुरोध के साथ-साथ अपने ऐप को ऐप पोर्ट नंबर सुनने की आवश्यकता है - /test
. आइए अपडेट करते हैं app.js
, आयात विवरणों के नीचे:
const app = express();
const port = process.env.PORT || 4000;
app.get("/test", async (req, res) => {
return res.status(200).json({ success: true });
});
app.listen(port, () => {
console.log(`Server is running at port ${port}`);
});
यहां से, हम सीखेंगे कि एक्सप्रेस में सामने आने वाली परिचालन त्रुटियों के विभिन्न उपयोग मामलों को कैसे संभालना है।
एक्सप्रेस में हैंडलिंग नॉट फाउंड एरर्स
मान लीजिए कि आपको उपयोगकर्ताओं के डेटाबेस से सभी उपयोगकर्ताओं को लाने की आवश्यकता है, तो आप एक संभावित त्रुटि परिदृश्य को कुशलतापूर्वक संभाल सकते हैं जहां तर्क को एक में लपेटकर डेटाबेस में कोई डेटा मौजूद नहीं है। try/catch
ब्लॉक - किसी भी त्रुटि को पकड़ने की उम्मीद है जो प्रोजेक्ट कर सकती है catch
खंड मैथा:
const getUser = () => undefined;
app.get("/get-user", async (req, res) => {
try {
const user = getUser();
if (!user) {
throw new Error('User not found');
}
} catch (error) {
console.log(error);
res.status(400).send(error.message)
}
return res.status(200).json({
success: true
});
});
इसका परिणाम यह होगा:
User not found
अब, जब यह अनुरोध किया जाता है (आप पोस्टमैन का उपयोग करके परीक्षण कर सकते हैं) और डेटाबेस पर कोई उपयोगकर्ता मौजूद नहीं है, तो क्लाइंट को एक त्रुटि संदेश प्राप्त होता है जो कहता है कि "उपयोगकर्ता नहीं मिला"। साथ ही, आप देखेंगे कि त्रुटि कंसोल में भी लॉग है।
त्रुटि हैंडलर मिडलवेयर के साथ त्रुटि से निपटने का अनुकूलन
हम एक त्रुटि हैंडलर मिडलवेयर बनाकर विकास का अनुकूलन कर सकते हैं जो सभी परिभाषित मार्गों के अंत में आएगा, ताकि यदि किसी एक मार्ग में कोई त्रुटि हो, तो एक्सप्रेस स्वचालित रूप से अगले मिडलवेयर पर नज़र रखेगा और सूची में नीचे जाता रहेगा जब तक यह त्रुटि हैंडलर तक नहीं पहुंच जाता। त्रुटि हैंडलर त्रुटि को संसाधित करेगा और ग्राहक को प्रतिक्रिया भी भेजेगा।
सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!
आरंभ करने के लिए, नामक फ़ोल्डर बनाएँ middleware
प्रोजेक्ट डायरेक्टरी में, और इस फोल्डर में, नामक एक फाइल बनाएं errorHandler.js
जो त्रुटि हैंडलर को परिभाषित करता है:
const errorHandler = (error, req, res, next) => {
console.log(error);
res.status(400).send(error.message);
}
module.exports = errorHandler;
हमारे मिडलवेयर फ़ंक्शन में, हमने एक्सप्रेस को अवगत कराया है कि यह एक बुनियादी मिडलवेयर फ़ंक्शन नहीं है, बल्कि एक एरर हैंडलर है, जिसे जोड़कर error
3 बुनियादी मापदंडों से पहले पैरामीटर।
अब, हम अपने डेमो में एरर हैंडलर का उपयोग करेंगे app.js
और त्रुटि हैंडलर मिडलवेयर के साथ उपयोगकर्ताओं को लाने की प्रारंभिक त्रुटि को संभालें, जैसा कि नीचे दिखाया गया है:
const getUser = () => undefined;
app.get("/get-user", async (req, res, next) => {
try {
const user = getUser();
if (!user) {
throw new Error("User not found");
}
} catch (error) {
return next(error);
}
});
app.use(errorHandler);
हम अपने कोड के चारों ओर एक अमूर्तता बनाकर और भी अधिक अनुकूलित कर सकते हैं try/catch
तर्क। हम प्रोजेक्ट डायरेक्टरी में एक नया फ़ोल्डर बनाकर इसे प्राप्त कर सकते हैं utils
, और इसमें एक फाइल बनाएं जिसका नाम है tryCatch.js
.
अमूर्त करने के लिए try-catch
तर्क - हम एक ऐसे फ़ंक्शन को परिभाषित कर सकते हैं जो किसी अन्य फ़ंक्शन को स्वीकार करता है (जिसे नियंत्रक) इसके पैरामीटर के रूप में, और एक देता है async
समारोह जो एक आयोजित करेगा try/catch
किसी भी प्राप्त नियंत्रक के लिए।
यदि नियंत्रक में कोई त्रुटि होती है, तो इसे पकड़ा जाता है catch
ब्लॉक और अगले फ़ंक्शन को कहा जाता है:
const tryCatch = (controller) => async (req, res, next) => {
try {
await controller(req, res);
} catch (error) {
return next(error);
}
};
module.exports = tryCatch;
उसके साथ try/catch
अबास्ट्रक्शन, हम अपने कोड को स्किप करके इसे और अधिक सक्सेसफुल बनाने के लिए रिफलेक्टर कर सकते हैं try-catch
में उपयोगकर्ताओं को लाते समय स्पष्ट रूप से उपवाक्य app.js
:
const getUser = () => undefined;
app.get(
"/get-user",
tryCatch(async (req, res) => {
const user = getUser();
if (!user) {
throw new Error("User not found");
}
res.status(400).send(error.message);
})
);
हमने ट्राइ-कैच लॉजिक को सफलतापूर्वक अमूर्त कर दिया है और हमारा कोड अभी भी उसी तरह काम करता है जैसा उसने पहले किया था।
एक्सप्रेस में सत्यापन त्रुटियों को संभालना
इस डेमो के लिए, हम अपने एक्सप्रेस ऐप में लॉगिन के लिए एक नया रूट बनाएंगे - लॉग इन करने पर एक यूजर आईडी को मान्य करने के लिए। सबसे पहले, हम इंस्टॉल करेंगे joi
पैकेज, एक स्कीमा बनाने में मदद के लिए, जिसके साथ हम आवश्यकताओं को लागू कर सकते हैं:
$ npm i joi
इसके बाद, एक स्कीमा बनाएं जो कि a Joi.object
पंजीकरण शुल्क userId
जो एक संख्या होनी चाहिए और आवश्यक है - जिसका अर्थ है कि अनुरोध उस पर उपयोगकर्ता आईडी के साथ ऑब्जेक्ट से मेल खाना चाहिए।
हम उपयोग कर सकते हैं validate()
स्कीमा ऑब्जेक्ट में स्कीमा के विरुद्ध प्रत्येक इनपुट को मान्य करने के लिए विधि:
const schema = Joi.object({
userId: Joi.number().required(),
});
app.post(
"/login",
tryCatch(async (req, res) => {
const {error, value} = schema.validate({});
if (error) throw error;
})
);
यदि किसी खाली वस्तु को इसमें पास किया जाता है validate()
विधि, त्रुटि को शालीनता से नियंत्रित किया जाएगा, और ग्राहक को त्रुटि संदेश भेजा जाएगा:
कंसोल पर, हमें एक्सेस भी मिलता है details
सरणी जिसमें त्रुटि के बारे में विभिन्न विवरण शामिल हैं जिन्हें जरूरत पड़ने पर उपयोगकर्ता को सूचित किया जा सकता है।
विशेष रूप से सत्यापन त्रुटियों को इस तरह से संभालने के लिए कि सत्यापन त्रुटि के अनुसार उचित त्रुटि विवरण पास करने के लिए, त्रुटि हैंडलर मिडलवेयर को फिर से सक्रिय किया जा सकता है:
const errorHandler = (error, req, res, next) => {
console.log(error);
if (error.name === "ValidationError") {
return res.status(400).send({
type: "ValidationError",
details: error.details,
});
}
res.status(400).send(error.message);
};
module.exports = errorHandler;
- errorHandler.js
अब अनुकूलित, जब हम पास की गई खाली वस्तु के साथ एक ही अनुरोध करते हैं validate()
तरीका:
अब हमारे पास एक अनुकूलित वस्तु तक पहुंच है जो संदेशों को अधिक पठनीय/अनुकूल तरीके से लौटाती है। इस तरह, हम आने वाली त्रुटि के प्रकार के आधार पर विभिन्न प्रकार की त्रुटियों को भेजने और संभालने में सक्षम होते हैं।
निष्कर्ष
इस गाइड में, हम Express.js की त्रुटि से निपटने के हर पहलू पर गए, जिसमें डिफ़ॉल्ट रूप से सिंक्रोनस और एसिंक्रोनस कोड को कैसे हैंडल किया जाता है, अपनी खुद की एरर क्लासेस कैसे बनाएं, कस्टम एरर-हैंडलिंग मिडलवेयर फ़ंक्शंस कैसे लिखें और प्रदान करें next
अंतिम कैच हैंडलर के रूप में
जैसा कि हर कार्य के साथ होता है, विकास के दौरान सर्वोत्तम अभ्यास भी होते हैं जिसमें प्रभावी त्रुटि प्रबंधन शामिल होता है, और आज हमने सीखा है कि हम एक एक्सप्रेस ऐप में त्रुटियों को एक मजबूत तरीके से कैसे संभाल सकते हैं।
त्रुटियों को ठीक से संभालने का अर्थ न केवल बग और त्रुटियों को आसानी से खोज कर विकास के समय को कम करना है बल्कि बड़े पैमाने के अनुप्रयोगों के लिए एक मजबूत कोडबेस विकसित करना भी है। इस गाइड में, हमने देखा है कि ऑपरेशनल एरर से निपटने के लिए मिडलवेयर कैसे सेट अप करें। त्रुटि से निपटने में सुधार करने के कुछ अन्य तरीकों में शामिल हैं: स्टैक ट्रेस नहीं भेजना, बेजोड़ अपवादों को संभालने के लिए प्रक्रियाओं को शालीनता से रोकना, उचित त्रुटि संदेश प्रदान करना, त्रुटि लॉग भेजना और एक वर्ग स्थापित करना जो विस्तारित करता है Error
वर्ग.
मुझे आशा है कि इस ट्यूटोरियल में मैंने जिन उदाहरणों का उपयोग किया है, वे आपके लिए सुखद थे। मैंने त्रुटि प्रबंधन के बारे में वास्तविक दुनिया में उपयोग के लिए एक एक्सप्रेस एप्लिकेशन लिखते समय संभावित रूप से आपके सामने आने वाले विभिन्न परिदृश्यों को कवर किया। कृपया मुझे बताएं कि क्या मुझे कुछ याद आया है। इससे हमें फायदा होगा और मुझे और सीखने में भी मदद मिलेगी। आपका दिन शुभ हो और पढ़ने के लिए धन्यवाद।
आप लेख में उपयोग किए गए सभी स्रोत कोड का उल्लेख कर सकते हैं Github.