logologo
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
หน้าหลัก
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
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การแจ้งเตือน
การแจ้งเตือนการแปลด้วย AI

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

#สคริปต์ JavaScript

เวิร์กโฟลว์: โหนด JavaScriptCommunity Edition+

#บทนำ

โหนดสคริปต์ 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() ในโค้ดเพื่อนำเข้าโมดูลครับ

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

WORKFLOW_SCRIPT_MODULES=crypto,timers,lodash,dayjs
คำแนะนำ

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

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

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

จากนั้นเพิ่มเส้นทางสัมพัทธ์ (หรือเส้นทางสัมบูรณ์) ของแพ็กเกจนั้นตาม CWD (ไดเรกทอรีทำงานปัจจุบัน) ของแอปพลิเคชันลงในตัวแปรสภาพแวดล้อม WORKFLOW_SCRIPT_MODULES:

WORKFLOW_SCRIPT_MODULES=./storage/node_modules/exceljs

จากนั้นจะสามารถใช้แพ็กเกจ exceljs ในสคริปต์ได้ (ชื่อใน require ต้องตรงกับที่กำหนดในตัวแปรสภาพแวดล้อมทุกประการ) ครับ:

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

#ตัวแปรโกลบอล

ไม่รองรับ ตัวแปรโกลบอล เช่น global, process, __dirname และ __filename เป็นต้นครับ

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

#พารามิเตอร์ที่ส่งเข้า

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

#ค่าส่งกลับ

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

return 123;

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

รองรับ การใช้ console เพื่อเอาต์พุตล็อกครับ

console.log('hello world!');

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

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

รองรับ การใช้ async เพื่อกำหนดฟังก์ชันอะซิงโครนัส และ await เพื่อเรียกใช้ฟังก์ชันอะซิงโครนัส รองรับ การใช้โกลบอลออบเจกต์ 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;