تعارف
صارفین کسی بھی ایپلیکیشن کے ساتھ تعامل کرتے وقت مستثنیات اور غلطی ضرور ہوتی ہیں، یہ سافٹ ویئر انجینئرز پر منحصر ہے کہ وہ جان بوجھ کر یا انجانے میں پیدا ہونے والی کسی بھی خرابی کو سنبھالنے کے لیے کوئی ذریعہ منتخب کریں۔ نتیجے کے طور پر، ایکسپریس کے ساتھ APIs بنانے والے بیک اینڈ ڈویلپرز خود کو یہ یقینی بنانے کے لیے کام کرتے ہوئے پاتے ہیں کہ وہ ایک کارآمد، موثر، اور قابل استعمال API بنا رہے ہیں۔ سب سے زیادہ اہمیت یہ ہے کہ غلطیوں کو اس طرح سنبھالا جائے کہ ایک مضبوط نظام بنایا جائے کیونکہ اس سے ترقی کے وقت، صریح غلطیاں، پیداواری مسائل کو کم کرنے میں مدد ملتی ہے، اور سافٹ ویئر کی ترقی کی کامیابی یا اسکیل ایبلٹی کا تعین ہوتا ہے۔
کیا آپ کو غلطی کے پیغام کو لاگ کرنے، غلطی کو دبانے، صارفین کو غلطی کے بارے میں مطلع کرنے، یا غلطیوں کو سنبھالنے کے لیے کوڈ لکھنے کی ضرورت ہے؟ مزید تعجب نہیں.
اس گائیڈ میں، ہم ایکسپریس ایپلی کیشنز کے لیے ایک مضبوط ایرر ہینڈلنگ کوڈ بیس بنانے کا طریقہ سیکھیں گے، جو ایپلی کیشن کی غلطیوں کا پتہ لگانے میں مدد فراہم کرے گا اور رن ٹائم کے دوران کسی بھی ایپلیکیشن کو خوبصورتی سے ناکام ہونے سے باز رکھنے کے لیے بہترین اقدامات کرے گا۔
نوٹ: ہم اپنے ڈیمو میں API کو جانچنے کے لیے پوسٹ مین کا استعمال کریں گے۔ آپ اسے پر ڈاؤن لوڈ کر سکتے ہیں۔ پوسٹ مین ڈاؤن لوڈ صفحہ. متبادل طور پر، آپ آسانی سے براؤزر، کمانڈ لائن استعمال کر سکتے ہیں۔ curl
ٹول، یا کوئی دوسرا ٹول جس سے آپ واقف ہوں گے۔
ایرر ہینڈلنگ کیا ہے؟
سافٹ ویئر ڈویلپمنٹ میں، دو مختلف قسم کی مستثنیات ہیں: آپریشنل اور پروگراماتی۔.
- رن ٹائم کے دوران آپریشنل ناکامیاں پیدا ہو سکتی ہیں، اور ایپلیکیشن کو اچانک ختم ہونے سے روکنے کے لیے، ہمیں غلطی سے نمٹنے کے موثر طریقوں کے ذریعے ان مستثنیات کو احسن طریقے سے ہینڈل کرنا چاہیے۔
- پروگرامی استثناء کو پروگرامر کے ذریعہ دستی طور پر پھینک دیا جاتا ہے، جب ایک غیر معمولی حالت پیدا ہوتی ہے۔
آپ آپریشنل مستثنیات کے بارے میں سوچ سکتے ہیں جیسے "غیر متوقع، لیکن متوقع" مستثنیات (جیسے کہ حد سے باہر کسی اشاریہ تک رسائی حاصل کرنا)، اور پروگرامی مستثنیات کو "متوقع اور متوقع" استثناء (جیسے نمبر فارمیٹنگ استثنا)۔
استثنیٰ ہینڈلنگ وہ طریقہ کار ہے جو کسی پروگرام میں خامیوں کو تلاش کرنے اور ان کو دور کرنے کے لیے استعمال ہوتا ہے۔ ایرر ہینڈلنگ پیغامات بھیجتا ہے جس میں غلطی کی قسم اور وہ اسٹیک شامل ہوتا ہے جہاں غلطی ہوئی تھی۔
نوٹ: کمپیوٹر سائنس میں، مستثنیات سے بازیافت ہوتی ہے، اور عام طور پر رن ٹائم کے دوران آپریشنل یا پروگرامی مسائل سے ہوتی ہے۔ خرابیاں عام طور پر بیرونی عوامل کی شکل میں پیدا ہوتی ہیں، جیسے ہارڈ ویئر کی حدود، کنیکٹیویٹی کے مسائل، میموری کی کمی، وغیرہ۔ جاوا اسکرپٹ میں، اصطلاحات کو اکثر ایک دوسرے کے ساتھ استعمال کیا جاتا ہے، اور حسب ضرورت مستثنیات سے اخذ کیا جاتا ہے۔ Error
کلاس Error
کلاس خود غلطیوں اور استثناء دونوں کی نمائندگی کرتا ہے۔
ایکسپریس میں، استثنیٰ ہینڈلنگ سے مراد یہ ہے کہ کس طرح ایکسپریس ہم آہنگی اور غیر مطابقت پذیر استثناء کو پکڑنے اور اس پر کارروائی کرنے کے لیے خود کو ترتیب دیتی ہے۔ ایکسپریس میں استثنیٰ ہینڈلنگ کے بارے میں اچھی بات یہ ہے کہ ایک ڈویلپر کے طور پر، آپ کو اپنے استثنائی ہینڈلرز لکھنے کی ضرورت نہیں ہے۔ ایکسپریس پہلے سے طے شدہ استثنا ہینڈلر کے ساتھ آتا ہے۔ استثنیٰ ہینڈلر غلطیوں کی نشاندہی کرنے اور صارف کو ان کی اطلاع دینے میں مدد کرتا ہے۔ یہ مختلف علاج کی حکمت عملی بھی فراہم کرتا ہے اور مستثنیات کو کم کرنے کے لیے ان کا نفاذ کرتا ہے۔
اگرچہ یہ لگتا ہے کہ بہت ساری چیزیں ہڈ کے نیچے جا رہی ہیں، ایکسپریس میں استثنیٰ ہینڈلنگ پروگرام کے مجموعی عمل کو سست نہیں کرتی ہے اور نہ ہی اس کے عمل کو روکتی ہے۔
ایکسپریس میں استثنا ہینڈلنگ کو سمجھنا
ایکسپریس کے ساتھ آنے والے ڈیفالٹ ایرر ہینڈلر کے ساتھ، ہمارے ہاتھ میں مڈل ویئر فنکشنز کا ایک سیٹ ہے جو روٹ ہینڈلرز میں خود بخود غلطیوں کو پکڑنے میں مدد کرتا ہے۔ جلد ہی، ہم تھیوری کو عملی جامہ پہنانے کے لیے ایک پروجیکٹ بنائیں گے کہ ایکسپریس ایپ میں صحیح غلطیوں کو کیسے واپس کیا جائے اور کس طرح حساس معلومات کو لیک نہ کیا جائے۔
ایکسپریس میں مڈل ویئر فنکشن کی وضاحت کرنا
غلطی سے نمٹنے کے مڈل ویئر کے افعال کی وضاحت اس طرح کی گئی ہے کہ وہ ایک کو قبول کرتے ہیں۔ Error
آبجیکٹ کو پہلے ان پٹ پیرامیٹر کے طور پر، اس کے بعد کسی دوسرے مڈل ویئر فنکشن کے ڈیفالٹ پیرامیٹرز: request
, response
، اور next
. next()
فنکشن تمام موجودہ مڈل ویئر کو روٹر کے لیے اگلے ایرر ہینڈلر پر چھوڑ دیتا ہے۔
ایکسپریس میں ایرر ہینڈلنگ ترتیب دینا
نوڈ اور ایکسپریس ایپ بنانے کے لیے اپنے ٹرمینل میں درج ذیل کمانڈ کو چلائیں۔
$ mkdir error-handling-express
نئے بنائے گئے فولڈر میں، آئیے ایک نیا نوڈ پروجیکٹ شروع کریں:
$ cd error-handling-express && npm init -y
یہ تخلیق کرتا ہے a 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 سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!
شروع کرنے کے لیے، نام کا ایک فولڈر بنائیں 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
جو کہ ایک نمبر ہونا چاہیے اور اس کی ضرورت ہے - یعنی درخواست کا کسی شے سے مماثل ہونا چاہیے جس پر صارف ID ہو۔
ہم استعمال کرسکتے ہیں 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 کے.