Node-RED 101

Nattarat Yaemphochai
3 min readDec 12, 2022

--

Node-RED คืออะไร ? องค์ประกอบแต่ละส่วนทำหน้าที่อะไรบ้าง ? รวมไปถึงการใช้งานเบื้องต้น บทความนี้จะเล่าให้ฟัง

Credit: https://www.elektormagazine.com/articles/starting-with-nodered

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 บอกผมไว้ได้เลย ยินดีเปิดรับฟังทุกความคิดเห็นเลย ขอบคุณมากครับ 🙏🏻

--

--