فهم البرمجة الغير متزامنة في Node.js واستخدام MongoDB
في بداية تعلمك لـ Node.js و MongoDB بعد 15 عامًا من استخدام VB6 و MySQL، يمكن أن تكون التحولات تحديًا. تفهم طبيعة البرمجة الغير متزامنة في Node.js واستخدام MongoDB يعد خطوة هامة. دعني أشرح لك الأكواد التي كتبتها وأقدم لك بعض الإرشادات لفهم كيفية استخدام واسترجاع البيانات بشكل صحيح.
أولاً وقبل كل شيء، يجب أن تعلم أن وظيفة collection.find().toArray
هي وظيفة غير متزامنة، ولذلك لا يمكنك استرجاع القيمة مباشرة منها. يجب أن تتعامل مع هذا باستخدام الوعد (Promise) أو استخدام وظيفة رد الاستدعاء (Callback function). في هذا السياق، سأستخدم وظيفة رد الاستدعاء لتبسيط الأمور.
-
رحلة اللاعب في عالم التكنولوجيا الحديثة24/01/2024
-
تبادل بيانات JSON بين C و Python بفعالية26/02/2024
لنقم بتعديل الكود كما يلي:
javascript// Db1.js
var MongoClient = require('mongodb').MongoClient;
module.exports = {
FindinCol1: function (callback) {
MongoClient.connect("mongodb://localhost:27017/db1", function (err, db) {
if (err) {
return callback(err, null);
}
var collection = db.collection('col1');
collection.find().toArray(function (err, items) {
if (err) {
return callback(err, null);
}
callback(null, items);
});
});
}
};
وفي ملف app.js
:
javascriptvar a = require('./db1');
a.FindinCol1(function (err, result) {
if (err) {
console.error(err);
} else {
console.log(result);
}
});
التغييرات الرئيسية هي إضافة وظيفة رد الاستدعاء في Db1.js
وتعديل طريقة استدعاء الدالة في app.js
. يتيح لك هذا التحديث التعامل بشكل أفضل مع البرمجة الغير متزامنة والتأكد من الحصول على البيانات بشكل صحيح.
في النهاية، يُفضل أيضاً استخدام Promises و async/await لتبسيط هذه العمليات وتجنب “Callback Hell”.
المزيد من المعلومات
بالطبع، دعونا نوسع على النقاط التي تم ذكرها في المشكلة ونقدم بعض الإرشادات والمعلومات الإضافية لتفهم أفضل كيفية التعامل مع Node.js و MongoDB.
أولاً وقبل كل شيء، يجب أن نتحدث عن مفهوم البرمجة الغير متزامنة في Node.js. Node.js هو بيئة تشغيل للجافا سكريبت مبنية على محرك V8، ويستخدم نموذج الحدث المحوري لتنفيذ العمليات بشكل فعال دون حاجة للانتظار. هذا يعني أن العمليات لا تنتظر بعضها بعضًا، وتستمر في التنفيذ بينما تنتظر العمليات الأخرى تكتمل.
عند العمل مع قواعد البيانات، مثل MongoDB، يصبح التعامل مع العمليات الغير متزامنة أمرًا حيويًا. في مثالك، لديك استخدام لوظيفة collection.find().toArray
التي تتطلب وقتاً لاسترجاع البيانات. لهذا السبب، يجب أن تتعامل مع هذه الوظائف باستخدام Callbacks أو Promises.
التعديل الذي قمت به في الكود يستخدم Callbacks، حيث يتم تمرير وظيفة الرد عند الاستدعاء للتعامل مع البيانات بعد اكتمال العملية.
إذا كنت ترغب في استخدام Promises، يمكنك تحديث الكود كالتالي:
javascript// Db1.js
var MongoClient = require('mongodb').MongoClient;
module.exports = {
FindinCol1: function () {
return new Promise((resolve, reject) => {
MongoClient.connect("mongodb://localhost:27017/db1", function (err, db) {
if (err) {
return reject(err);
}
var collection = db.collection('col1');
collection.find().toArray(function (err, items) {
if (err) {
return reject(err);
}
resolve(items);
});
});
});
}
};
وفي app.js
:
javascriptvar a = require('./db1');
a.FindinCol1()
.then(result => {
console.log(result);
})
.catch(err => {
console.error(err);
});
هذا يستخدم Promises لجعل الكود أكثر قراءة وفهمًا، ويسمح لك باستخدام then
و catch
للتعامل مع النتائج أو الأخطاء بشكل أنظف.