ทำความรู้จักกับตัวแปร ใน Node-red

L Pasawee
Dr-Zin
Published in
3 min readAug 18, 2019

ทำความรู้จจักกับ context data ที่เก็บข้อมูลของตัวแปรต่างใน Node-red

ตัวแปรของ 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 แบบนี้ จะเห็นว่าค่าด้านหลังมีการเพิ่มขึ้นตามจำนวนครั้งที่กด เพราะว่ามีการใช้งานตัวแปรร่วมกัน

--

--