Node-RED 101
Node-RED คืออะไร ? องค์ประกอบแต่ละส่วนทำหน้าที่อะไรบ้าง ? รวมไปถึงการใช้งานเบื้องต้น บทความนี้จะเล่าให้ฟัง
Node-RED คืออะไร ?
Node-RED คือ เครื่องมือสำหรับเชื่อมต่ออุปกรณ์, APIs หรือเซอร์วิสต่าง ๆ เข้าด้วยกันด้วยวิธีที่น่าสนใจ
โดยเจ้าตัว Node-RED มีลักษณะ browser-based editor ที่ช่วยให้การลากวางหรือลากเส้นเชื่อมเข้าหากันเป็นเรื่องง่ายและสามารถที่จะ deploy ได้ในคลิกเดียว
ขยายความ browser-based editor ให้เห็นภาพมากขึ้น ก็คือเจ้าตัว editor ที่เราจะพัฒนา Flow ขึ้นมาเนี่ย มันจะอยู่บนเว็บเบราเซอร์ ค่อนข้างสะดวกทีเดียว (ภาพประกอบด้านล่างครับ)
ในพาร์ทต่อไป จะอธิบายเกี่ยวกับองค์ประกอบต่าง ๆ ที่สำคัญใน Node-RED รวมไปถึงหน้าที่ขององค์ประกอบนั้น ๆ ด้วย
Node
สิ่งนี้ก็คือคำสั่งต่าง ๆที่เราจะเอามาใช้ ซึ่งเป็นส่วนหนึ่งหรือส่วนย่อย ๆ ภายใน Flow ซึ่งตัวโหนดจะถูกทริกเกอร์ให้ทำงานจากการได้รับ message จากโหนดก่อนหน้าหรือจากการที่ได้รับ event จากภายนอก อาทิ การรอรับ HTTP Request, หรือการทริกเกอร์จาก timer
ยกตัวอย่างเช่น เมื่อมีการส่ง HTTP Request มาที่โหนด HTTP ก็จะเกิดการ process ขึ้น ซึ่งเราก็จะได้ก้อน Req ออกมาจากโหนด HTTP จากนั้นเราก็อาจจะส่งต่อเจ้าก้อนนี้ไปให้โหนดถัดไปเพื่อ process ต่อ (ภาพประกอบด้านล่างครับ)
Configuration Node
คือ โหนดชนิดพิเศษที่ใช้สำหรับเก็บค่า config เพื่อนำมาใช้ซ้ำหรือแชร์ค่านั้นกับโหนดชนิดเดียวกันได้
ตัวอย่างเช่น เรามีโหนด MongoDB ซึ่งเป็นโหนดที่สามารถทำ operation ต่างๆกับข้อมูลที่อยู่ในฐานข้อมูล MongoDB ได้ ซึ่งหมายความว่าจะต้องมีการเชื่อมต่อกับฐานข้อมูลเกิดขึ้น
Configuration Node นี้เองที่จะคอยบันทึก connection เก็บไว้ เพื่อให้โหนด MongoDB อันอื่น ๆสามารถเชื่อมต่อ connection เดียวกันโดยที่ไม่ต้องกรอกค่าใหม่ให้เสียเวลา
จากภาพคือผม config connection ของตัว MongoDB Server ในครั้งแรก
และในครั้งต่อๆไปผมสามารถที่เลือก connection จาก selection ได้เลย
Flow
โฟล์วจะแสดงในลักษณะของแท็บบน editor ซึ่งภายในแต่ละแท็บนั้นคือ workspace สำหรับแก้ไขและจัดการโหนดต่าง ๆ ได้
Context
เป็นการเก็บข้อมูล โดยข้อมูลนั้นจะสามารถแชร์กันระหว่างโหนดหรือในโหนดเดียวกันได้ ซึ่ง context มีอยู่ 3 ชนิดแบ่งตามสโคป ดังนี้
- context — เก็บข้อมูลภายในแต่ละโหนด โดยโหนดอื่นๆจะไม่สามารถเข้าถึงค่าข้อมูลได้
- flow — เก็บข้อมูลมูลภายในโฟล์วแต่ละโฟล์วเท่านั้น โหนดที่อยู่ในโฟล์วนั้นเท่านั้นที่จะสามารถเข้าถึงข้อมูลได้
- global — เก็บข้อมูลแบบ Global ทุกโหนด ทุกโฟล์วสามารถเข้าถึงข้อมูลได้
ผมจะอธิบายการใช้งานของแต่ละชนิดด้านล่างนะครับ
แบบ Context
let value = context.get("a") || 0 // get ค่า context 'a' หาก undefined เราจะให้กำหนดให้ value = 0
let payload = value
context.set("a", value + 1) // ทำการ set context 'a' ใหม่ให้มีค่าเท่ากับ value + 1 ไปเรื่อย ๆ
msg.payload = payload
return msg
แบบ Flow
โหนดตัวที่ 1 ซึ่งอาจจะเป็นโหนดสำหรับ set ค่า Context Data (ซึ่งอาจจะถูกทริกเกอร์ให้ set ค่าใหม่เรื่อย ๆ โดย timer หรือ event ใดๆก็ตาม)
let value = flow.get("b") || 0
flow.set("b", value + 1)
โหนดตัวที่ 2 เป็นโหนดที่จะ get ค่าไป process ต่อ
let newValue = flow.get("b")
let payload = `The new value of b is ${newValue}`
msg.payload = payload
return msg
แบบ Global
โหนดตัวที่ 1
let value = global.get("c") || 0
global.set("c", value)
โหนดตัวที่ 2 (ซึ่งอาจจะไม่ได้อยู่ในโฟล์วเดียวกับโหนดตัวที่ 1)
let newValue = global.get("c")
let payload = `The new value of c is ${newValue}`
msg.payload = payload
return msg
จากตัวอย่างอาจจะไม่ได้ต่างกันมาก แต่สิ่งที่ต่างกันคือ Scope ในการเข้าถึงข้อมูลตามที่ผมได้อธิบายไว้ข้างต้นนั่นเอง
Message
คือสิ่งที่ส่งให้กันระหว่างโหนดภายในโฟล์ว มีลักษณะเป็น JavaScript Object ที่สามารถกำหนด properties อะไรก็ได้ โดย property หลักในการรับส่งข้อมูลระหว่างโหนดใน Node-RED ก็คือ payload นั่นเอง
จากตัวอย่างในส่วนที่ผมได้อธิบายเรื่อง Context จะเห็นว่าภายในโค้ดนั้นจะมีการ return msg ออกไป และได้มีการกำหนด property payload ไว้ ซึ่ง Object นี้จะถูกส่งไปให้โหนดถัดไป
Subflow
คือ โฟล์วย่อยที่รวบรวมหรือยุบโหนดต่าง ๆ อยู่ในโหนดเดียวกันได้ เพื่อลดคตวามซับซ้อนของโฟล์ว และสามารถที่จะเอาไป reuse ใช้ได้ในหลายๆที่ทั้งในโฟล์วเดียวกันหรือต่างโฟล์ว
เราสามารถที่จะไปที่ hamburger menu มุมบนขวาแล้วกด Create Subflow จากเมนู Subflow ได้ เมื่อคลิกแล้วจะปรากฏ Subflow ขึ้นมาแท็บใหม่
Wire
คือเส้นที่เราลากเชื่อมต่อกันระหว่างโหนดภายในโฟล์ว เพื่อให้เห็นว่าโฟล์วมีการไหลของ message อย่างไรนั่นเอง
Palette
คือสิ่งที่อยู่ด้านซ้ายของ editor เพื่อแสดงโหนดต่าง ๆ ที่พร้อมใช้งาน โดยเราสามารถติดตั้งโหนดเพิ่มได้ผ่าน Command-Line และ Palette Manager
Sidebar
สิ่งนี้จะอยู่ตรงด้านขวาของ editor ซึ่งประกอบไปด้วย panel ต่างๆ เช่นการแสดงข้อมูลต่างๆของโหนดแต่ละโหนด ซึ่งอาจจะเป็นคำอธิบายการใช้งานของผู้ที่พัฒนาโหนดนั้นขึ้นมา การแสดง debug message และการดู Configuration Node
ในพาร์ทต่อไปผมจะลองสร้าง Flow ตัวอย่าง ซึ่งเป็นระบบจัดการสมาชิกแบบคร่าวๆนะครับ
จากภาพจะเห็นว่าผมเตรียม API ไว้สำหรับ CRUD Operation
ยกตัวอย่างตามภาพก็คือ
- เมื่อมีการเรียกมาที่ GET /users จะทำการ query data จากฐานข้อมูลแล้ว return ก้อนข้อมูลออกไปแล้ว debug message ผ่านทาง panel
- เมื่อมีการเรียกมาที่ POST /users จะทำการ validate ข้อมูลก่อนที่นึงเพื่อเช็คว่า required fields ครบถ้วนหรือไม่ หาก validate fail จะทำการ response กลับไปด้วย { status: 400, message: ‘create user failed’ } หาก validate success จะนำไป insert เข้าฐานข้อมูลพร้อมทั้ง response status 201 กลับไปและแจ้งเตือนผ่าน line ว่ามีสมาชิกใหม่เกิดขึ้น
สำหรับบทความเกี่ยวกับ Node-RED 101 ของผมก็มีประมาณนี้ครับ หากมีเวลา ในพาร์ทต่อไปผมจะมาเขียนบทความการสร้าง Node ขึ้นมาใช้งานเองให้ได้อ่านกันนะครับ
หากมีข้อผิดพลาดประการใด ผมขออภัยมา ณ ทีนี้ด้วยครับ หรือหากผู้อ่านท่านใดมีข้อเสนอแนะ คำติชม สามารถ comment บอกผมไว้ได้เลย ยินดีเปิดรับฟังทุกความคิดเห็นเลย ขอบคุณมากครับ 🙏🏻