في هذا السياق، يبدو أن هناك مشكلة مع استخدام this
في معالج الطرق (route handler) في ExpressJS. تحديدًا في كلاس groupsCtrl
، عند استخدام this
داخل دالة get
، تظهر قيمة undefined
. السبب في ذلك هو كيفية تمرير الدوال إلى ExpressJS.
في مكان ما في ملف routes.js
، تقوم بتحديد دالة get
كدالة معالجة للطريق “/groups/”، ولكن هذه الدالة ليست محددة بشكل صحيح. عند تحديد معالج الطرق، يجب عليك أن تضمن أن الدالة المحددة لديها السياق الصحيح. في هذه الحالة، يجب عليك تغيير ترتيب الوسائط في الدالة get
في ملف groups.js
لتكون req
أولاً و res
ثانيًا.
لذلك، يمكنك تعديل كود groups.js
ليبدو كالتالي:
javascriptclass groupsCtrl {
constructor() {
this.info = "test";
}
get(req, res) {
console.log("LOG ! ", JSON.stringify(this));
}
}
module.exports = new groupsCtrl(); //singleton
عندما تقوم ExpressJS بالاستدعاء لمعالج الطرق، يتم تمرير req
(طلب) أولاً ثم res
(استجابة)، لذا يجب أن تتبع نفس الترتيب في تعريف دالة المعالجة.
بهذا التغيير، يجب أن يكون لديك الوصول الصحيح إلى this
داخل دالة get
في ملف groups.js
، ولن يعود قيمة undefined
بعد هذا التعديل.
المزيد من المعلومات
بالطبع، دعنا نوسع قليلاً على الموضوع. المشكلة التي واجهتك تعود إلى كيفية تمرير الدوال في JavaScript وكيفية تحديد واستخدام this
في هذا السياق.
في JavaScript، قاعدة هامة تتعلق بـ this
هي أن قيمته يتم تحديدها ديناميكيًا اعتمادًا على كيفية استدعاء الدالة. عند استخدام دوال كمعالجات لـ ExpressJS، يتم استدعاؤها داخل سياق ExpressJS، وبالتالي، this
يتم تحديده وفقًا لهذا السياق.
في مثالك، عندما قمت بتعيين groupsCtrl.get
كمعالج للطريق “/groups/”، ExpressJS يقوم بفعلياً بالاستدعاء الداخلي لهذه الدالة، وفي هذا السياق، this
لا يشير إلى الكائن groupsCtrl
كما هو متوقع.
لحل هذا، يجب أن يتم تحديد الدالة get
داخل groupsCtrl
بطريقة تعتمد على تحديد this
بشكل صحيح. عند تغيير ترتيب الوسائط لتكون req
ثم res
، تحققت من أن this
يشير إلى الكائن groupsCtrl
الصحيح.
هذا التوجيه يندرج تحت مفهوم أو طريقة الاستدعاء “Method Invocation” في JavaScript، حيث يتم استدعاء الدالة كجزء من كائن معين، وبالتالي، this
يشير إلى ذلك الكائن.
إذا كان لديك أي أسئلة إضافية أو تحتاج إلى مزيد من التوضيح، فلا تتردد في طرحها.