logologo
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
logologo
เวิร์กโฟลว์
ภาพรวม
เริ่มต้นใช้งาน

ทริกเกอร์

ภาพรวม
เหตุการณ์ตารางข้อมูล
งานที่กำหนดเวลา
เหตุการณ์ก่อนการดำเนินการ
เหตุการณ์หลังการดำเนินการ
เหตุการณ์การดำเนินการที่กำหนดเอง
การอนุมัติ
Webhook

โหนด

ภาพรวม

AI

LLM

การควบคุมโฟลว์

เงื่อนไข
แยกสาขาหลายเงื่อนไข
วนซ้ำ
ตัวแปร
แยกสาขาแบบขนาน
เรียกใช้เวิร์กโฟลว์
ผลลัพธ์ของโฟลว์
การแมปตัวแปร JSON
การหน่วงเวลา
สิ้นสุด

การคำนวณ

การคำนวณ
การคำนวณวันที่
การคำนวณ JSON

การดำเนินการข้อมูล

เพิ่มข้อมูล
อัปเดตข้อมูล
ค้นหาข้อมูล
ลบข้อมูล
การดำเนินการ SQL

การดำเนินการด้วยตนเอง

การดำเนินการด้วยตนเอง
การอนุมัติ
ส่งสำเนา (CC)

ขยายประเภท

คำขอ HTTP
สคริปต์ JavaScript
การแจ้งเตือน
ส่งอีเมล
การตอบกลับ
ข้อความตอบกลับ
ตัวแปร
บันทึกการดำเนินการ
การจัดการเวอร์ชัน
ตัวเลือกขั้นสูง

การพัฒนาส่วนขยาย

ภาพรวม
ขยายประเภททริกเกอร์
ขยายประเภทโหนด
การอ้างอิง API
Previous Pageคำขอ HTTP
Next Pageการแจ้งเตือน
TIP

เอกสารนี้แปลโดย AI หากมีข้อมูลที่ไม่ถูกต้อง โปรดดูเวอร์ชันภาษาอังกฤษ

#สคริปต์ JavaScript

This feature is provided by the commercial plugin «เวิร์กโฟลว์: โหนด JavaScript», please purchase to use

#บทนำ

โหนดสคริปต์ JavaScript ช่วยให้ผู้ใช้สามารถรันสคริปต์ JavaScript แบบกำหนดเองที่ฝั่งเซิร์ฟเวอร์ภายใน เวิร์กโฟลว์ ได้ครับ/ค่ะ ในสคริปต์สามารถใช้ตัวแปรจากโหนดต้นทางใน เวิร์กโฟลว์ เป็นพารามิเตอร์ได้ และค่าที่ส่งกลับจากสคริปต์ยังสามารถนำไปใช้กับโหนดปลายทางได้อีกด้วยครับ/ค่ะ

สคริปต์จะทำงานใน Worker Thread บนเซิร์ฟเวอร์ของแอปพลิเคชัน NocoBase และรองรับฟีเจอร์ส่วนใหญ่ของ Node.js แต่ก็ยังมีความแตกต่างบางประการจากสภาพแวดล้อมการรันแบบ Native ดูรายละเอียดเพิ่มเติมได้ที่ รายการคุณสมบัติ ครับ/ค่ะ

#การสร้างโหนด

ในหน้าจอการกำหนดค่า เวิร์กโฟลว์ ให้คลิกปุ่มเครื่องหมายบวก (“+”) ในผัง เวิร์กโฟลว์ เพื่อเพิ่มโหนด “JavaScript” ครับ/ค่ะ

20241202203457

#การกำหนดค่าโหนด

20241202203655

#พารามิเตอร์

ใช้สำหรับส่งผ่านตัวแปรหรือค่าคงที่จากบริบทของ เวิร์กโฟลว์ เข้าไปยังสคริปต์ เพื่อให้โค้ดในสคริปต์สามารถนำไปใช้งานได้ โดยที่ name คือชื่อพารามิเตอร์ ซึ่งเมื่อส่งเข้าไปในสคริปต์แล้วจะกลายเป็นชื่อตัวแปร ส่วน value คือค่าของพารามิเตอร์ สามารถเลือกได้ว่าเป็นตัวแปรหรือค่าคงที่ครับ/ค่ะ

#เนื้อหาสคริปต์

เนื้อหาของสคริปต์สามารถมองได้ว่าเป็นฟังก์ชันหนึ่ง คุณสามารถเขียนโค้ด JavaScript ใด ๆ ที่รองรับในสภาพแวดล้อม Node.js ได้ และสามารถใช้คำสั่ง return เพื่อส่งค่ากลับเป็นผลลัพธ์ของการทำงานของโหนด เพื่อให้โหนดถัดไปสามารถนำไปใช้เป็นตัวแปรได้ครับ/ค่ะ

หลังจากเขียนโค้ดแล้ว คุณสามารถคลิกปุ่มทดสอบที่อยู่ด้านล่างช่องแก้ไข เพื่อเปิดกล่องโต้ตอบสำหรับการทดสอบการทำงาน โดยสามารถกรอกค่าคงที่ลงในพารามิเตอร์เพื่อจำลองการทำงานได้ หลังจากรันแล้ว คุณจะเห็นค่าที่ส่งกลับและเนื้อหาเอาต์พุต (ล็อก) ในกล่องโต้ตอบครับ/ค่ะ

20241202203833

#การตั้งค่าการหมดเวลา

หน่วยเป็นมิลลิวินาที เมื่อตั้งค่าเป็น 0 หมายถึงไม่มีการตั้งค่าการหมดเวลาครับ/ค่ะ

#ดำเนินการต่อเมื่อเกิดข้อผิดพลาด

หากเลือกตัวเลือกนี้ โหนดถัดไปจะยังคงทำงานต่อไป แม้ว่าสคริปต์จะเกิดข้อผิดพลาดหรือหมดเวลาก็ตามครับ/ค่ะ

ข้อควรทราบ

หากสคริปต์เกิดข้อผิดพลาด จะไม่มีค่าส่งกลับ และผลลัพธ์ของโหนดจะถูกเติมด้วยข้อความแสดงข้อผิดพลาด หากโหนดถัดไปใช้ตัวแปรผลลัพธ์จากโหนดสคริปต์ จะต้องจัดการด้วยความระมัดระวังครับ/ค่ะ

#รายการคุณสมบัติ

#เวอร์ชัน Node.js

เป็นเวอร์ชันเดียวกับ Node.js ที่แอปพลิเคชันหลักใช้งานอยู่ครับ/ค่ะ

#การรองรับโมดูล

สามารถใช้โมดูลในสคริปต์ได้โดยมีข้อจำกัด ซึ่งสอดคล้องกับ CommonJS โดยใช้คำสั่ง require() เพื่อนำเข้าโมดูลในโค้ดครับ/ค่ะ

รองรับโมดูล Native ของ Node.js และโมดูลที่ติดตั้งอยู่ใน node_modules (รวมถึงแพ็กเกจที่ NocoBase ใช้งานอยู่แล้ว) โมดูลที่จะนำไปใช้ในโค้ดจะต้องประกาศในตัวแปรสภาพแวดล้อมของแอปพลิเคชันชื่อ WORKFLOW_SCRIPT_MODULES โดยชื่อแพ็กเกจหลายชื่อให้คั่นด้วยเครื่องหมายจุลภาค (,) เช่น

WORKFLOW_SCRIPT_MODULES=crypto,timers,lodash,dayjs
ข้อควรทราบ

โมดูลที่ไม่ได้ประกาศในตัวแปรสภาพแวดล้อม WORKFLOW_SCRIPT_MODULES แม้จะเป็นโมดูล Native ของ Node.js หรือติดตั้งอยู่ใน node_modules แล้วก็ตาม ก็ไม่สามารถนำมาใช้ในสคริปต์ได้ครับ/ค่ะ นโยบายนี้สามารถใช้ในการควบคุมรายการโมดูลที่ผู้ใช้สามารถใช้งานได้ในระดับการปฏิบัติงาน เพื่อป้องกันไม่ให้สคริปต์มีสิทธิ์มากเกินไปในบางสถานการณ์ครับ/ค่ะ

ในสภาพแวดล้อมที่ไม่ได้ติดตั้งจาก Source Code หากโมดูลใด ๆ ไม่ได้ติดตั้งอยู่ใน node_modules คุณสามารถติดตั้งแพ็กเกจที่ต้องการด้วยตนเองลงในไดเรกทอรี storage ได้ครับ/ค่ะ ตัวอย่างเช่น หากต้องการใช้แพ็กเกจ exceljs คุณสามารถทำตามขั้นตอนต่อไปนี้ได้ครับ/ค่ะ

cd storage
npm i --no-save --no-package-lock --prefix . exceljs

จากนั้นให้เพิ่มพาธสัมพัทธ์ (หรือพาธแบบเต็ม) ของแพ็กเกจนั้น โดยอิงจาก CWD (Current Working Directory) ของแอปพลิเคชัน ไปยังตัวแปรสภาพแวดล้อม WORKFLOW_SCRIPT_MODULES ครับ/ค่ะ

WORKFLOW_SCRIPT_MODULES=./storage/node_modules/exceljs

คุณก็จะสามารถใช้แพ็กเกจ exceljs ในสคริปต์ของคุณได้ครับ/ค่ะ

const ExcelJS = require('exceljs');
// ...

#ตัวแปร Global

ไม่รองรับ ตัวแปร Global เช่น global, process, __dirname และ __filename ครับ/ค่ะ

console.log(global); // will throw error: "global is not defined"

#พารามิเตอร์ขาเข้า

พารามิเตอร์ที่กำหนดค่าไว้ในโหนดจะกลายเป็นตัวแปร Global ภายในสคริปต์ และสามารถนำไปใช้ได้โดยตรง พารามิเตอร์ที่ส่งไปยังสคริปต์จะรองรับเฉพาะประเภทข้อมูลพื้นฐานเท่านั้น เช่น boolean, number, string, object และ Array อ็อบเจกต์ Date เมื่อส่งเข้ามาจะถูกแปลงเป็นสตริงในรูปแบบ ISO ประเภทข้อมูลที่ซับซ้อนอื่น ๆ เช่น อินสแตนซ์ของคลาสที่กำหนดเอง จะไม่สามารถส่งผ่านได้โดยตรงครับ/ค่ะ

#ค่าส่งกลับ

สามารถใช้คำสั่ง return เพื่อส่งค่าข้อมูลประเภทพื้นฐาน (ตามกฎเดียวกับพารามิเตอร์) กลับไปยังโหนดเพื่อเป็นผลลัพธ์ได้ หากไม่มีการเรียกใช้คำสั่ง return ในโค้ด การทำงานของโหนดจะไม่มีค่าส่งกลับครับ/ค่ะ

return 123;

#เอาต์พุต (ล็อก)

รองรับ การใช้ console เพื่อแสดงผลล็อกครับ/ค่ะ

console.log('hello world!');

เมื่อ เวิร์กโฟลว์ ถูกรัน เอาต์พุตของโหนดสคริปต์ก็จะถูกบันทึกลงในไฟล์ล็อกของ เวิร์กโฟลว์ นั้น ๆ ด้วยครับ/ค่ะ

#อะซิงโครนัส

รองรับ การใช้ async เพื่อกำหนดฟังก์ชันอะซิงโครนัส และ await เพื่อเรียกใช้ฟังก์ชันอะซิงโครนัส รองรับ การใช้ Global Object Promise ครับ/ค่ะ

async function test() {
  return Promise.resolve(1);
}

const value = await test();
return value;

#ตัวจับเวลา

หากต้องการใช้วิธีการต่าง ๆ เช่น setTimeout, setInterval หรือ setImmediate คุณจะต้องนำเข้าจากแพ็กเกจ timers ของ Node.js ครับ/ค่ะ

const { setTimeout, setInterval, setImmediate, clearTimeout, clearInterval, clearImmediate } = require('timers');

async function sleep(time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

await sleep(1000);

return 123;