ตัวแปรของ Node-red
Node-red โดยปกติจะทำงานผ่าน msg Object เมื่อได้รับ msg Object ใหม่ จะเข้ามาแทนที่ Object เก่าและข้อมูลเก่าในแต่ละ node จนหมด Node-red จึงมีสิ่งที่เรียกว่า context มาเพื่อเก็บข้อมูลจาก แต่ละ node โดย context แบ่งเป็น 3 ประเภทคือ
- context : เก็บข้อมูลภายในแต่ละ Node ไม่สามารถเข้าถึงจาก node อื่นได้
- flow : เก็บข้อมูลมูลภายใน 1 Flow เท่านั่น เข้าถึงจาก Flow อื่นไม่ได้
- global : เก็บข้อมูลแบบ Global ทุก Node และ Flow สามารถ เข้าถึงได้
Context
เป็นการเก็บข้อมูลเฉพาะในแต่ละ node เท่านั่น nodeอื่นจะมาใช้งานไม่ได้ หรือจะไปใช้ของ node อื่นไม่ได้
เรียกใช้งาน ตัวแปรใน Context
สามารถเรียกใช้ได้แบบตัวอย่างข้างล่าง เป็นการเรียกใช้งานข้อมูลชื่อว่า count และ count2 ที่เก็บใน context
var count = context.get('count') || 0;
var count2 = context.get('count2') || 0;
เรียกใช้งาน Object ก็ได้เช่นกันแบบข้างล่าง เป็นการเรียก Object ชื่อ data และตรวจสอบว่า มี property count ไหมถ้าไม่มีให้กำหนดใหม่เป็น 0
var local=context.get('data') || {};
if (local.count===undefined) //test exists
{
local.count=0;
}
กำหนดค่าให้ตัวแปรใน Context
context.set(name)=x;
ลองใช้งาน Node Context กัน
โดยการลาก node ตามในรูปมาวางบน Flow แบบนี้
จากนั่นเพิ่มโค้ดใน Function ด้านบนตามตัวอย่าง เป็นการเรียกใช้งาน count จาก context ที่เป็นตัวแปรทั่วไป
และเพิ่มโค้ดใน Function ด้านล่างตามตัวอย่าง เป็นการเรียกใช้ object ที่ชื่อว่า data จาก context
จากนั่นกดที่ inject ทั้ง 2 ตัวเราจะได้ผลลัพธ์ใน debug ตามนี้
จะเห็นว่าด้านท้ายของข้อความจะเป็นเลข 1 เหมือนกัน แสดงว่า Context ของ Function ด้านบนและด้านล่างไม่เกี่ยวกัน
Flow
เป็น Context Data ที่เก็บข้อมูลภายใน Flow ของตัวเองเท่านั่น ทำให้ node ทั้งหมดใน Flow สามารถเข้าถึงข้อมูลได้
อ่านข้อมูลจาก Flow
var count=flow.get('count') || 0;
เก็บข้อมูลใน Flow
flow.set('count',count);
ลองใช้งาน Flow กัน
ลาก node แบบในรูปมาวางบน Flow และตั้งชื่อ Function ตามได้เลย
ใน with Flow และ with Flow 2 ให้ใส่ โค้ดที่เหมือนกันตามตัวอย่างข้างล่าง
แล้วกดที่ inject ทั้งสองอันสลับกัน และดูผลที่ debug จะเห็นว่าค่าด้านหลังมีการเพิ่มขึ้นตามจำนวนครั้งที่กด เพราะว่ามีการใช้งานตัวแปรร่วมกัน
Global
เป็นตัวแปรที่สามารถเข้าถึงได้จาก ทุก Node และ ทุก Flow ภายใน Node-red
อ่านข้อมูลจาก Global
var count = global.get('count') || 0;
เก็บข้อมูลใน Global
global.set('count',count);
ลองใช้งาน Global กัน
สร้าง Flow ใหม่ตั้งชื่อว่า Flow1 โดยการกดที่เครื่องหมายบวก ทางด้านขวา
ลาก node แบบในรูปมาวางบน Flow และตั้งชื่อ Function ตามได้เลย
ใน Flow ที่ชื่อว่า Create
ใน Flow ที่ชื่อว่า Flow1
ใน Function ทั้ง 2 ใส่โค้ดเหมือนกันตามตัวอย่าง
กด inject ทั้งสอง Flow สลับกันจะเห็นผลลัพธ์ในช่อง debug แบบนี้ จะเห็นว่าค่าด้านหลังมีการเพิ่มขึ้นตามจำนวนครั้งที่กด เพราะว่ามีการใช้งานตัวแปรร่วมกัน