لا تترك الخطأ يمر! استراتيجية ذكية لتوحيد معالجة الأخطاء في Express.js و Nodejs

كيفية كتابة وظيفة واحدة تعالج جميع أخطاء Node.js
كيف تحول كودك إلى آلة معالجة أخطاء ذكية باستخدام module.exports

وداعاً للتعقيد! توحيد الايرو في حالة catch لجميع requests في Node.js

إذا كنت مطورًا يعمل على بناء تطبيقات باستخدام Node.js ، فمن المؤكد أنك واجهت مشكلة التعامل مع الأخطاء (Errors) عند استخدام الوظائف غير المتزامنة (async functions). قد تكون عملية كتابة كود لمعالجة الأخطاء لكل طلب (request) منفصلة مملة ومعقدة. ولكن ما رأيك إذا كان هناك حل بسيط يساعدك على توحيد هذه العملية؟

في هذا المقال الحصري، سنستعرض كيفية استخدام module.exports لإنشاء وظيفة ذكية تقوم بتوحيد معالجة الأخطاء في حالة catch لجميع الطلبات (requests) بطريقة سلسة وفعالة حيث يُعد توحيد الايرو في حالة catch لجميع requests في Node.js طريقة فعالة لتحسين سهولة قراءة كود التطبيق وصيانته وقابليته للاختبار.


لماذا تحتاج إلى توحيد معالجة الأخطاء؟

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


بدون وجود نظام موحد لمعالجة الأخطاء، قد تضطر إلى كتابة كود مشابه في كل وظيفة، مما يؤدي إلى:

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

ما هو توحيد الايرو في حالة catch؟

هو كتابة كود catch بنفس الطريقة لجميع requests في التطبيق.


كيف يتم توحيد الايرو في حالة catch؟

  1. يمكن استخدام دالة middleware لمعالجة جميع requests.
  2. يمكن استخدام مكتبة مثل Express-async-handler لمعالجة جميع requests.


إنشاء component لتوحيد errors في حالة try,catch في nodejs


module.exports = (asyncFun)=>{
return (req,res,next)=>{
    asyncFun(req,res,next).catch((err)=>{
        next(err);
    });
}
}
شرح الكود:
module.exports 
نحن نقوم بتصدير وظيفة يمكن إعادة استخدامها في أي مكان داخل تطبيقنا.
(asyncFun)
هذه الوظيفة تأخذ وظيفة غير متزامنة (async function) كمدخل.
return (req, res, next) 
يتم إرجاع وظيفة جديدة تحتوي على المعاملات القياسية لـ Express.js: req (الطلب)، res (الاستجابة)، وnext (الوظيفة التالية).
.catch((err) => { next(err); }) 
إذا حدث خطأ أثناء تنفيذ الوظيفة غير المتزامنة، سيتم التقاط الخطأ (catch) وإرساله إلى وظيفة next، مما يتيح لك معالجة الخطأ بشكل مركزي.

طريقة استخدام component في توحيد المشاكل


const handelErrors = ('../handelErrors');


const getUser = handelErrors(async(req,res,next)=>{
    const user = await User.findOne(res.body.email);
    if (!user) {
        const error = new Error();
        error.message = "the user is not found";
        error.statusCode = 404;
        return next(error);
    }
    return res.json({
        data:user
    });
})

بدلا من


const getStoreList = async (req, res) => {

    try {
       const user = await User.findOne(res.body.email);
    if (!user) {
        const error = new Error();
        error.message = "the user is not found";
        error.statusCode = 404;
        return next(error);
    }
    return res.json({
        data:user
    });
    } catch (error) {
        console.log(error)
        return res.status(500).send({ status: 500, message: "faild to list store database" })
    }
}

بالتالي سوف يكون الايرور موحد ولن تحتاج في كل مره لاستخدام catch لارسال الايرور فقط سوف يتم ارسالة بشكل مباشر من middelware.

ولا تنسى استخدام middelware في main

app.use((error,req,res,next) =>{
    return res.status(error.statusCode || 500).json({
    status:"Error",
    msg:error.message
    });
});

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

تعليقات