كيفية البدء سريعًا باستخدام VUE3.0:
يمكن أن تساعدك البرامج الوسيطة للتعامل مع الأخطاء في برنامج Learn Express على معالجة الأخطاء دون تكرار نفس العمل. بافتراض أنك تتعامل مع الأخطاء مباشرة في معالج المسار السريع:
app.put('/user/:id', async (req, res) => { السماح للمستخدم يحاول { المستخدم = انتظار User.findOneAndUpdate({ _id: req.params.id }, req.body) } مسك (يخطئ) { إرجاع res.status(err.status || 500).json({ message: err.message }) } إرجاع res.json({user}) })
يعمل الكود أعلاه بشكل جيد، ولكن ماذا لو كان هناك مئات الواجهات، فسيصبح منطق معالجة الأخطاء غير قابل للصيانة لأنه يتكرر مئات المرات.
ينقسم Express إلى أنواع مختلفة وفقًا لعدد المعلمات التي تتخذها وظيفة البرنامج الوسيط. يتم تعريف وظيفة البرنامج الوسيط التي تقبل 4 معلمات على أنها برنامج وسيط لمعالجة الأخطاء ولن يتم استدعاؤها إلا عند حدوث خطأ.
تطبيق const = يتطلب ('express')() app.get('*', وظيفة RouteHandler() { // تُلقي هذه البرامج الوسيطة خطأً وسينتقل Express مباشرةً إلى معالج الأخطاء التالي throw new Error('Oops!') }) app.get('*', (req, res, next) => { // هذا البرنامج الوسيط ليس معالجًا للأخطاء (3 معلمات فقط)، وسوف يتخطاه Express نظرًا لوجود خطأ في البرنامج الوسيط السابق console.log('لن تتم طباعة هذا') }) // يجب أن تقبل وظيفتك 4 معلمات حتى يتعامل معها Express على أنها برامج وسيطة لمعالجة الأخطاء. app.use ((err، req، res، next) => { res.status(500).json({ الرسالة: err.message }) })
سيتعامل Express تلقائيًا مع أخطاء المزامنة نيابةً عنك، مثل طريقة routeHandler()
أعلاه. لكن Express لا يتعامل مع الأخطاء غير المتزامنة. في حالة حدوث خطأ غير متزامن، يجب استدعاء التابع next()
.
تطبيق const = يتطلب ('express')() app.get('*', (req, res, next) => { // الطريقة التالية () تخبر Express بالانتقال إلى البرنامج الوسيط التالي في السلسلة. // لا يتعامل Express مع الأخطاء غير المتزامنة، لذلك تحتاج إلى الإبلاغ عن الأخطاء عن طريق الاتصال بـ next(). setImmediate(() => { التالي (خطأ جديد ("عفوا")) }) }) app.use ((err، req، res، next) => { res.status(500).json({ الرسالة: err.message }) })
تذكر أن البرامج الوسيطة Express يتم تنفيذها بشكل تسلسلي. يجب عليك تحديد معالجات الأخطاء أخيرًا، بعد كل البرامج الوسيطة الأخرى. بخلاف ذلك، لن يتم استدعاء معالج الأخطاء الخاص بك:
async/await
Express مع async/await لا يمكن أن يلتقط استثناءات من promise
، وقد تمت كتابة Express قبل ES6، ولا يوجد حل جيد لكيفية التعامل async/await
الذي يرميه.
على سبيل المثال، لا يرسل الخادم التالي استجابة HTTP بنجاح لأنه لم تتم معالجة reject
الوعد مطلقًا:
const app = require('express')() app.get('*', (req, res, next) => { // يجب أن يمر الإبلاغ عن الأخطاء غير المتزامنة بعد ذلك () إرجاع وعد جديد ((حل، رفض) => { setImmediate(() => رفض(new Error('woops'))) }).قبض (التالي) }) app.use((خطأ، طلب، دقة، التالي) => { console.log('لن تتم الطباعة') res.json({ الرسالة: error.message }) })يمكننا تغليف
app.listen(3000)
أو استخدام مكتبة موجودة لالتقاطها.
أولاً، نقوم ببساطة بتغليف وظيفة للاتصال async/await
مع البرامج الوسيطة لمعالجة الأخطاء السريعة.
ملاحظة : تُرجع الدالات غير المتزامنة Promise، لذا عليك التأكد من
catch()
وتمريرها إلىnext()
.
وظيفة التفافAsync (الجبهة الوطنية) { وظيفة الإرجاع (req، res، التالي) { الجبهة الوطنية (req، الدقة، التالي).catch (التالي) } } app.get('*', WrapAsync(async (req, res) => { في انتظار الوعد الجديد (resolve => setTimeout(() =>resolve(), 50)) // خطأ غير متزامن! رمي خطأ جديد ("woops") }))
استخدم مكتبة الطرف الثالث express-async-errors
، وهو اختراق دعم غير متزامن/انتظار بسيط لـ ES6:
require('express-async-errors') app.get('*', غير متزامن (req, res, next) => { في انتظار الوعد الجديد ((الحل) => setTimeout(() => العزم(), 50)) رمي خطأ جديد ("woops") })
يتيح لك البرنامج الوسيط لمعالجة الأخطاء Express التعامل مع الأخطاء بطريقة تزيد من الفصل بين الاهتمامات. لا تحتاج إلى معالجة الأخطاء في منطق عملك، ولا حتى try/catch
إذا كنت تستخدم async/await
. ستظهر هذه الأخطاء في معالج الأخطاء الخاص بك، والذي يمكنه بعد ذلك تحديد كيفية الاستجابة للطلب. تأكد من الاستفادة من هذه الميزة القوية في تطبيق Express التالي!