"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني ربط الوعود بشكل صحيح في Node.js عند العمل مع استعلامات قاعدة البيانات؟

كيف يمكنني ربط الوعود بشكل صحيح في Node.js عند العمل مع استعلامات قاعدة البيانات؟

تم النشر بتاريخ 2024-11-21
تصفح:778

How Can I Chain Promises Correctly in Node.js When Working with Database Queries?

مشكلات الوعد والاتصال

في كود Node.js هذا، من المتوقع أن ينتظر الوعد حتى اكتمال وظيفة findUser، والتي لا. تنبع المشكلة من التنفيذ غير المتزامن لاستعلامات قاعدة البيانات.

وظيفة رد الاتصال

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

لمعالجة هذه المشكلة، يجب أن تقوم وظيفة findUser بتمرير رد اتصال إلى Pool.getConnection الذي يحل الوعد أو يرفضه، للإشارة إلى ما إذا كان الاستعلام ناجحًا أم لا.

الوعود المتسلسلة

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

promise.then(function(rows) {
    return new Promise(function (resolve, reject) {
        loginC.doSomething(data);

        if (success) {
            resolve(data);
        } else {
            reject(reason);
        }
    });
}, function(reason) {
    console.log("error handler second");
});

معالجة الأخطاء

سبب إخراج رسالة "معالج الأخطاء الثانية" هو حدوث خطأ عند فشل اتصال قاعدة البيانات. لم يتم استخدام معالجة الخطأ في مستمع الأحداث Connection.on('error') بشكل صحيح. ينتشر هذا الخطأ إلى وظيفة findUser ويتم التقاطه بواسطة معالج الخطأ الثاني في التسلسل.

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

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3