نموذج البرمجة Node-RED

مبتدئ

image_pdf

السياق (Context) :

كما تعلمت أن الرسائل هي الطريقة الوحيدة للحصول على بيانات الدخول و الخروج من العقد . في حين أن هذا غير صحيح عموما، هناك استثناء واحد لهذه القاعدة وهي متاحة لعقدة Function . عقد funcrion  لها قدرة على الوصول إلى كائن خاص يسمى السياق (context) و الذي يتم استخدامه لحفظ البيانات في الذاكرة التي تستمر من رسالة إلى وصول الأخرى. وهذا أمر مهم للعقد التي تحتاج إلى الحفاظ على مؤشر أو العقد أو مجموع البيانات في الرسائل. وبالإضافة إلى هذا السياق المحلي، يوجد السياق العالمي context.global وهو متاح لتبادل البيانات بين كل من عقد function من التدفق.  وسيتم تغطية استخدام السياق عند مناقشة عقدة function في مزيد من التفاصيل .

استخدام السياق (Context) في عقدة function :

وحدة خاصة تسمى السياق (Context) ، تستخدم لتخزين البيانات بين استدعاء الـ function ، ويتوفر على عقدة function . وهي مفيدة عندما تحتاج وظيفية للإحتفاظ بالـ state للقيام بالمعالجة . على سبيل المثال، دعونا نستخدم السياق (context) لحساب عدد الرسائل التي تمت معالجتها في عقدة function عندما تم نشرها. دعونا ننشئ عقدة function التي تضيف خاصية العد إلى كل رسالة تقوم بمعالجتها، كما هو موضح بالكود ادناه .

if (!context.value) {
context.value = 0;
}
context.value +=1;
msg.count = context.value;
return msg;

ويمكن التوصيلها، عادة يتم بناء التدفق كما هو موضح بالصورة أدناه :

the-node-red-programming-model

تأكد من تغيير عقدة debug لعرض  ‘complete msg object’ حتى تتمكن من رؤية خاصية العد.

the-node-red-programming-model

قم بنشر (Deploy) و اختبار التدفق

the-node-red-programming-model

ستلاحظ ان السياق يتم إعادة تعيينه كل مرة يتم نشر عقدة Function  . إذا كنت بحاجة لحفظ الـ state بين عمليات النشر ، وسوف تحتاج إلى استخدام بعض وحدات التخزين الخارجية مثل ملف أو قاعدة تخزين .

استخدام السياق العالمي (Global Context) :

بالإضافة إلى سياق عقدة Function الفردية ، وحدة السياق العالمية هي متاحة لمشاركة السياق بين عقد Function . دعونا نستخدم هذه الوحدة لمعرفة مدى دقة عقدة التاخير (delay) ، كما هو مبين بالشكل التالي :

the-node-red-programming-model

يظهر الكود لعقدة Function لحفظ وقت بدء التدفق في خاصية السياق العالمي أدناه :

context.global.startTime = new Date().getTime();
return msg;

وفي عقدة الـFunction الأخرى ، يتم احساب الوقت المنقضي، حيث نقوم بإنشاء رسالة تحتوي على الوقت الذي انقضى منذ مرور الرسالة من خلال عقدة Function لحفظ وقت البدء ، كما هو مبين بالكود أدناه :

var currentTime = new Date().getTime();
var timeElapsed = (currentTime - context.global.startTime)/1000;
msg.payload = "Time elapsed is: "+timeElapsed+"s";
return msg;

إضافة و إعداد عقدة التأخير (delay) لتأخير الرسالة لمدة 2 ثانية ، ثم انقر على عقدة inject ، والانتظار حوالي 2 ثانية . إذا سارت الأمور بشكل جيد، فإن إخراج عقد debug  يجب أن تشير إلى الوقت المنقضي وهو على مقربه من 2 ثانية .

وميزة هذا النهج هي أننا لا نحتاج رسالة لتحمل وقت البدء. و العيب هو أنه وصلت رسالة أخرى في حفظ وقت البدء قبل الوقت المنقضي ، سيتم الاستبدال و الكتابه على المتغير context.global.startTime .

X
تم إضافة المنتج إلى السلة بنجاح