مشروع : موقع لتبادل الخبرات
اجتماع تبادل المهارات هو عبارة عن حدث يقوم فيه الناس بمشاركة اهتماماتهم مع بعضهم البعض بتقديم عروص صغيرة حول الأشياء التي يعرفونها،ففي لقاء تبادل المهارات الخاص بالحدائق العامة على سبيل المثال قد يفسر شخص ما كيفية زراعة الكرفس، أو يمكنك أنت مثلا المرور على اجتماع تبادل المهارات الخاص بالبرمجة و القاء عرض حول النود جي أس (Node.js).
مثل هذه اللقاءات تسمى عادة بـ"مجموعات المستخدمين" عندما تكون متعلقة بمجال الكمبيوتر، تعتبر هذه اللقاءات وسيلة رائعة لتوسيع آفاقك و التعرف على التطوارت الجديدة، أو ببساطة لقاء أناس يشاركونك نفس الإهتمامات، فالعديد من المدن الكبرى لديها اجتماع الجافاسكربت ويكون الحضور إليها في العادة بشكل مجاني وقد وجدت أن جميع هذه الإجتماعات ودية و مرحبة.
يتمثل هدفنا خلال هذا الفصل الأخير في إعداد موقع يقوم بإدارة المحادثات في اجتماع لتبادل المهارات، تخيل مجموعة من الناس تقوم بالإجتماع في مكتب الأعضاء بصفة منتظمة للحديث عن (قيادة الدراجات أحادية العجلة) ، المشكلة تكمن في أنه عند ذهاب منظم الإجتماعات السابقة إلى مدينة أخرى لا أحد يقوم بخلافة المنظم، و لذلك نريد نظاما يتيح للمشاركين اقتراح و مناقشة الأحاديث بدون الحاجة إلى منظم .
تماما مثل الفصل السابق، الأكواد البرمجية المذكورة في هذا الفصل تخص النود جي إس و تشغيلها مباشرة على صفحة الHtml قد يؤدي إلى عدم اشتغالها، يمكنك تحميل كود المشروع بالكامل من على الرابط التاليeloquentjavascript.net/code/skillsharing.zip
التصميم
هنالك جانب مخصص للسيرفر في هذا المشروع مكتوب لـ(Node.js) وجانب مخصص للعميل((Client مكتوب لـلمتصفح، حيث يقوم السيرفر أو الخادم بتخزين بيانات النظام و تمريرها للعميل، كما يقدم أيضا ملفات الـ html و javascript والتي تقوم بدورها بتنفيذ نظام العميل (Client-side System).
يقوم السيرفر بالإحتفاظ بقائمة المحادثات المقترحة للإجتماع القادم و يقوم ال(client) بعرض هذه القائمة , كل حديث يحتوي على إسم المقدِّم،العنوان، و الملخص و قائمة من التعليقات المتعلقة بالمحادثة، يسمح الـ((client للمستخدمين بإجراء محادثات جديدة(إضافتها الى القائمة)، حذف المحادثات، والتعليق على المحادثات، كلما أراد المستخدم إجراء تغيير ما يقوم ال(client) بطلب HTTP (HTTP request) لإعلام السيرفر بهذا التغيير.
سيتم إعداد التطبيق لعمل عرض مباشر للمحادثات الجارية حاليا و التعليقات المرتبطة بها، كلما أراد مستخدم ما من أي مكان القيام بإجراء حديث جديد أو إضافة تعليق، سيرى جميع المستخدمين الذين قاموا بفتح تلك الصفحة جميع التغييرات على متصفحاتهم و على الفور، و هذا ما يشكل نوعا من التحدي حيث لاتوجد طريقة لفتح اتصال من الخادم (Server)الى العميل (client) كما لا توجد وسيلة جيدة لمعرفة الموقع المعين الذي يبحث عنه ال client)) حاليا.
هنالك في الحقيقة حل شائع لهذه المشكلة ويسمى بالـ(Long polling), و الذي يعتبر واحدا من دوافع تصميم الـنود جي إس.
الــ Long Polling
لتكون قادرا على إعلام ال(Client) فورا بأن شيئا ما قد تغير، سيكون عليك الإتصال مع هذا الأخير، ولكن المتصفحات عادة لا تقبل الاتصالات وأن ال client هي في العادة من تقف خلف هذه الأجهزة وتمنع مثل هذه الاتصالات، عموما فهو من غير المحبذ الإعتماد على الخادم في مثل هذه الاتصالات.
يمكننا تدبر فتح إتصال للعميل (Client) و ابقاءها بالجوار حتى يتسنى للخادم استعمالها لإرسال المعلومات عندما يحتاج لذلك.
لكن طلب الHTTP (HTTP request) يسمح بتدفق أو مرور المعلومات البسيطة فقط ، حيث يقوم العميل client بإرسال طلب ويعود الخادم مع استجابة واحدة فقط و هذا كل شيء !، لكن هناك تقنية تدعى مأخذ الويب(Web Sockets) تدعمها المتصفحات الحديثة، التقنية من شأنها أن تمكن من فتح اتصالات لتبادل البيانات العشوائية و لكن استخدامها بشكل صحيح يعتبر صعبا نوعا ما.
في هذا الفصل سوف نستخدم تقنية بسيطة نسبيا ، الـ long polling ، يقوم الclient بطلب معلومات جديدة باستمرار من الخادم باستعمال طلبات HTTP العادية ويقوم الخادم بالمماطلة في الإجابة عندما لا يكون هناك أي شيء جديد لتقديمه.
يتلقى العميلclient المعلومات مباشرة من الخادم طالما أنه يتأكد من أن طلب الإقتراع (polling request) مفتوح باستمرار، فعلى سبيل المثال إذا كان تطبيقنا مفتوحا مثلا على متصفح أحد المستخدمين فلنفرض أن سمها َأليس Alice سيكون متصفح Alice قد تقدم بطلب للحصول على التحديثات و في انتظار وصول الإستجابة ، فعندما يقوم شخص آخر و لنفرض أن اسمه بوب Bob بوضع محادثة جديدة حول قيادة الدراجات أحادية العجلة في المنحدرات الشديدة سوف يلاحظ الخادم أن Alice في الإنتظار للحصول على التحديثات وسيقوم بإرسال المعلومات حول المحادثة الجديدة (الخاصة بBob) استجابة لطلبها المعلق، سيقوم متصفح Alice بعد ذلك باستقبال البيانات وعرضها على الشاشة لإظهار المحادثة الخاصة ب Bob.