دليل لمعالجة الاستثناءات في ذكاء بيانات PlatoBlockchain السريع. البحث العمودي. منظمة العفو الدولية.

دليل لمعالجة الاستثناءات في Express

المُقدّمة

لا بد أن تحدث الاستثناءات والخطأ أثناء تفاعل المستخدمين مع أي تطبيق ، والأمر متروك لمهندسي البرمجيات لاختيار وسيلة للتعامل مع أي خطأ قد ينشأ - عن قصد أو عن غير قصد. نتيجة لذلك ، يجد مطورو الواجهة الخلفية الذين ينشئون واجهات برمجة التطبيقات مع Express أنفسهم يعملون للتأكد من أنهم يبنون واجهة برمجة تطبيقات مفيدة وفعالة وقابلة للاستخدام. والأهم من ذلك هو معالجة الأخطاء بطريقة لبناء نظام قوي لأن هذا يساعد على تقليل وقت التطوير ، والأخطاء الصريحة ، وقضايا الإنتاجية ، ويحدد نجاح أو قابلية تطوير البرامج.

هل تحتاج إلى تسجيل رسالة الخطأ ، أو قمع الخطأ ، أو إعلام المستخدمين بالخطأ ، أو كتابة رمز للتعامل مع الأخطاء؟ أتساءل لا أكثر.

في هذا الدليل ، سنتعلم كيفية إنشاء قاعدة بيانات قوية لمعالجة الأخطاء لتطبيقات Express ، والتي ستساعد في المساعدة على اكتشاف أخطاء التطبيق واتخاذ الإجراءات المثلى لاستعادة أي تطبيق من الفشل بأمان أثناء وقت التشغيل.

ملحوظة: سنستخدم Postman لاختبار API في العرض التوضيحي الخاص بنا. يمكنك تنزيله على ملف صفحة تنزيل ساعي البريد. بدلاً من ذلك ، يمكنك ببساطة استخدام المتصفح ، سطر الأوامر curl أداة أو أي أداة أخرى قد تكون على دراية بها.

ما هو التعامل مع الخطأ؟

في تطوير البرمجيات ، هناك نوعان مختلفان من الاستثناءات: تشغيل و برنامجي.

  • قد تظهر حالات فشل تشغيلية أثناء وقت التشغيل ، ومن أجل منع التطبيق من الإنهاء المفاجئ ، يجب علينا التعامل مع هذه الاستثناءات بأمان من خلال أساليب معالجة الأخطاء الفعالة.
  • يتم طرح الاستثناءات البرمجية يدويًا بواسطة مبرمج ، عند ظهور حالة استثنائية.

يمكنك التفكير في الاستثناءات التشغيلية على أنها استثناءات "غير متوقعة ولكن متوقعة" (مثل الوصول إلى فهرس خارج الحدود) ، والاستثناءات البرمجية كاستثناءات "متوقعة ومتوقعة" (مثل استثناء تنسيق الأرقام).

معالجة الاستثناءات هي الإجراء المستخدم لإيجاد وإصلاح العيوب داخل البرنامج. تؤدي معالجة الأخطاء إلى إرسال رسائل تتضمن نوع الخطأ الذي حدث والمكدس الذي حدث فيه الخطأ.

ملحوظة: في علوم الكمبيوتر ، يمكن استرداد الاستثناءات من ، وعادةً ما تنبع من المشكلات التشغيلية أو البرامجية أثناء وقت التشغيل. تظهر الأخطاء عادةً على شكل عوامل خارجية ، مثل قيود الأجهزة ، ومشكلات الاتصال ، ونقص الذاكرة ، وما إلى ذلك. في JavaScript ، تُستخدم المصطلحات في كثير من الأحيان بالتبادل ، ويتم اشتقاق الاستثناءات المخصصة من Error صف دراسي. ال Error الفئة نفسها تمثل كلا من الأخطاء والاستثناءات.

في Express ، تشير معالجة الاستثناءات إلى كيفية إعداد Express نفسه لالتقاط ومعالجة الاستثناءات المتزامنة وغير المتزامنة. الشيء الجيد في معالجة الاستثناءات في Express هو أنه بصفتك مطورًا ، لا تحتاج إلى كتابة معالجات الاستثناءات الخاصة بك ؛ يأتي Express مع معالج استثناء افتراضي. يساعد معالج الاستثناء في تحديد الأخطاء وإبلاغ المستخدم بها. كما أنها توفر استراتيجيات علاجية متنوعة وتنفذها للتخفيف من الاستثناءات.

في حين أن هذه قد تبدو كأنها الكثير من الأشياء التي تجري تحت الغطاء ، فإن معالجة الاستثناءات في Express لا تبطئ العملية الكلية للبرنامج أو توقف تنفيذها مؤقتًا.

فهم التعامل مع الاستثناءات في Express

باستخدام معالج الأخطاء الافتراضي الذي يأتي مع Express ، لدينا مجموعة من وظائف البرامج الوسيطة التي تساعد في اكتشاف الأخطاء في معالجات التوجيه تلقائيًا. سننشئ قريبًا مشروعًا لوضع النظرية موضع التنفيذ حول كيفية إرجاع الأخطاء المناسبة في تطبيق Express وكيفية عدم تسريب المعلومات الحساسة.

تحديد وظيفة البرامج الوسيطة في Express

يتم تعريف وظائف معالجة الأخطاء البرمجية بطريقة تسمح لها بقبول الامتداد Error الكائن كمعامل إدخال أول ، متبوعًا بالمعلمات الافتراضية لأي دالة وسيطة أخرى: request, responseو next. next() تتخطى الوظيفة جميع البرامج الوسيطة الحالية إلى معالج الأخطاء التالي لجهاز التوجيه.

إعداد معالجة الأخطاء في Express

قم بتشغيل الأمر التالي في جهازك لإنشاء تطبيق Node and Express:

$ mkdir error-handling-express

في المجلد الذي تم إنشاؤه حديثًا ، دعنا نبدأ مشروع Node جديد:

$ cd error-handling-express && npm init -y

هذا يخلق package.json ملف في مجلدنا.

لإنشاء خادم Express في تطبيق Node الخاص بنا ، يتعين علينا تثبيت ملف express حزمة، dotenv لتحميل متغيرات البيئة تلقائيًا إلى .env ملف في process.env الكائن و nodemon لإعادة تشغيل تطبيق العقدة إذا تم ملاحظة تغيير الملف في الدليل.

$ npm install express dotenv nodemon

بعد ذلك ، قم بإنشاء ملف app.js ملف في مجلد المشروع والذي سيكون بمثابة ملف فهرس للتطبيق.

الآن بعد أن قمنا بتثبيت جميع التبعيات المطلوبة لتطبيق Express الخاص بنا ، نحتاج إلى إعداد البرنامج النصي لقراءة التطبيق في 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، ويمكن الوصول إليها لاحقًا.

تهيئة Express Server

الآن ، نحتاج إلى تهيئة خادم Express وجعل تطبيقنا يستمع إلى رقم منفذ التطبيق ، جنبًا إلى جنب مع طلب مسار الاختبار - /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}`);
});

من الآن فصاعدًا ، سوف نتعلم كيفية التعامل مع حالات الاستخدام المختلفة للأخطاء التشغيلية التي يمكن مواجهتها ، في Express.

معالجة أخطاء لم يتم العثور عليها في Express

لنفترض أنك بحاجة إلى جلب جميع المستخدمين من قاعدة بيانات للمستخدمين ، يمكنك التعامل بكفاءة مع سيناريو خطأ محتمل حيث لا توجد بيانات في قاعدة البيانات ، عن طريق تغليف المنطق في try/catch block - على أمل اكتشاف أي خطأ يمكن أن يظهر في 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

الآن ، عند إجراء هذا الطلب (يمكنك الاختبار باستخدام Postman) ولا يوجد مستخدم في قاعدة البيانات ، يتلقى العميل رسالة خطأ تقول "لم يتم العثور على المستخدم". أيضًا ، ستلاحظ أن الخطأ قد تم تسجيله في وحدة التحكم أيضًا.

تحسين معالجة الأخطاء باستخدام البرامج الوسيطة لمعالج الأخطاء

يمكننا تحسين التطوير من خلال إنشاء برمجية وسيطة لمعالج الأخطاء تأتي في نهاية جميع المسارات المحددة ، بحيث إذا حدث خطأ في أحد المسارات ، فسيقوم Express تلقائيًا بإلقاء نظرة على البرامج الوسيطة التالية ويستمر في الانتقال إلى أسفل القائمة حتى تصل إلى معالج الخطأ. سيعالج معالج الخطأ الخطأ ويرسل أيضًا استجابة إلى العميل.

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

للبدء ، قم بإنشاء مجلد يسمى middleware في دليل المشروع ، وفي هذا المجلد ، قم بإنشاء ملف يسمى errorHandler.js الذي يحدد معالج الخطأ:

const errorHandler = (error, req, res, next) => {
    
    console.log(error); 
    
    res.status(400).send(error.message); 
}
module.exports = errorHandler;

في وظيفة البرامج الوسيطة الخاصة بنا ، جعلنا Express على دراية بأن هذه ليست وظيفة برمجية وسيطة أساسية ، بل هي معالج أخطاء ، وذلك عن طريق إضافة 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);
	})
);

لقد نجحنا في استخلاص منطق try-catch بعيدًا ولا يزال الكود الخاص بنا يعمل كما كان من قبل.

معالجة أخطاء التحقق من الصحة في Express

بالنسبة لهذا العرض التوضيحي ، سننشئ مسارًا جديدًا في تطبيق Express لتسجيل الدخول - للتحقق من صحة معرف المستخدم عند تسجيل الدخول. أولاً ، سنقوم بتثبيت joi الحزمة للمساعدة في إنشاء مخطط يمكننا من خلاله فرض المتطلبات:

$ npm i joi

بعد ذلك ، قم بإنشاء مخطط وهو ملف 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() الأسلوب:

دليل لمعالجة الاستثناءات في ذكاء بيانات PlatoBlockchain السريع. البحث العمودي. منظمة العفو الدولية.

لدينا الآن إمكانية الوصول إلى كائن مخصص يقوم بإرجاع الرسائل بطريقة سهلة القراءة / أكثر سهولة. بهذه الطريقة ، يمكننا إرسال أنواع مختلفة من الأخطاء والتعامل معها بناءً على نوع الخطأ الوارد.

وفي الختام

في هذا الدليل ، راجعنا كل جانب من جوانب معالجة الأخطاء في Express.js ، بما في ذلك كيفية التعامل مع التعليمات البرمجية المتزامنة وغير المتزامنة افتراضيًا ، وكيفية إنشاء فئات الأخطاء الخاصة بك ، وكيفية كتابة وظائف مخصصة لمعالجة الأخطاء وتوفيرها next كمعالج الالتقاط النهائي

كما هو الحال مع كل مهمة هناك ، هناك أيضًا أفضل الممارسات أثناء التطوير والتي تشمل المعالجة الفعالة للأخطاء ، واليوم تعلمنا كيف يمكننا التعامل مع الأخطاء في تطبيق Express بطريقة قوية.

لا يعني التعامل مع الأخطاء بشكل صحيح تقليل وقت التطوير من خلال العثور على الأخطاء والأخطاء بسهولة فحسب ، بل يعني أيضًا تطوير قاعدة بيانات قوية للتطبيقات واسعة النطاق. في هذا الدليل ، رأينا كيفية إعداد البرامج الوسيطة للتعامل مع الأخطاء التشغيلية. تتضمن بعض الطرق الأخرى لتحسين معالجة الأخطاء: عدم إرسال تتبعات المكدس ، وإيقاف العمليات بأمان للتعامل مع الاستثناءات غير المعلنة ، وتقديم رسائل الخطأ المناسبة ، وإرسال سجلات الأخطاء ، وإعداد فئة تعمل على توسيع Error فئة.

آمل أن تكون الأمثلة التي استخدمتها في هذا البرنامج التعليمي ممتعة بالنسبة لك. لقد قمت بتغطية العديد من السيناريوهات التي من المحتمل أن تواجهها عند كتابة تطبيق Express لاستخدامه في العالم الحقيقي حول إدارة الأخطاء. من فضلك ، أخبرني إذا كان هناك أي شيء فاتني. سوف يفيدنا ذلك ويساعدني على تعلم المزيد أيضًا. أتمنى لك يوما سعيدا وشكرا على القراءة.

يمكنك الرجوع إلى جميع التعليمات البرمجية المصدر المستخدمة في المقالة على جيثب.

مصادر إضافية

الطابع الزمني:

اكثر من ستاكابوز