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

เริ่มต้นใช้งานฉบับย่อ

ภาพรวมการพัฒนาปลั๊กอิน
การเขียนปลั๊กอินแรกของคุณ
โครงสร้างไดเรกทอรีโปรเจกต์

การพัฒนาฝั่งเซิร์ฟเวอร์

ภาพรวม
ปลั๊กอิน
คอลเลกชัน
การดำเนินการฐานข้อมูล
การจัดการแหล่งข้อมูล
การจัดการทรัพยากร
การควบคุมการเข้าถึง (ACL)
มิดเดิลแวร์
แคช
เหตุการณ์
คอนเท็กซ์คำขอ
สคริปต์การย้ายข้อมูล
ล็อก
การทำให้เป็นสากล (I18n)
คำสั่ง
การจัดการงานที่กำหนดเวลา
การทดสอบ

การพัฒนาฝั่งไคลเอนต์

ภาพรวม
ปลั๊กอิน
คอนเท็กซ์
เราเตอร์
การควบคุมการเข้าถึง (ACL)
การจัดการแหล่งข้อมูล
ทรัพยากร
คำขอ
สไตล์และธีม
ล็อก
การทำให้เป็นสากล (I18n)
การทดสอบ

อื่นๆ

คู่มือการอัปเกรดปลั๊กอิน
รายการภาษา
การจัดการ Dependencies
การสร้าง
Previous Pageแคช
Next Pageคอนเท็กซ์คำขอ
TIP

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

#เหตุการณ์ (Event)

เซิร์ฟเวอร์ (Server) ของ NocoBase จะมีการทริกเกอร์เหตุการณ์ (Event) ที่เกี่ยวข้องในขั้นตอนต่าง ๆ ตลอดวงจรชีวิตของแอปพลิเคชัน วงจรชีวิตของปลั๊กอิน และการดำเนินการกับฐานข้อมูลครับ/ค่ะ นักพัฒนาปลั๊กอินสามารถดักฟัง (listen) เหตุการณ์เหล่านี้เพื่อนำไปใช้ในการขยายขอบเขตการทำงาน (extension logic) การทำงานอัตโนมัติ หรือการปรับแต่งพฤติกรรมต่าง ๆ ได้ครับ/ค่ะ

ระบบเหตุการณ์ของ NocoBase แบ่งออกเป็นสองระดับหลัก ๆ ดังนี้ครับ/ค่ะ:

  • app.on() - เหตุการณ์ระดับแอปพลิเคชัน: ใช้สำหรับดักฟังเหตุการณ์ที่เกี่ยวข้องกับวงจรชีวิตของแอปพลิเคชัน เช่น การเริ่มต้น (startup) การติดตั้ง (installation) การเปิดใช้งานปลั๊กอิน (enabling plugins) เป็นต้นครับ/ค่ะ
  • db.on() - เหตุการณ์ระดับฐานข้อมูล: ใช้สำหรับดักฟังเหตุการณ์การดำเนินการที่เกิดขึ้นในระดับโมเดลข้อมูล เช่น การสร้าง (creating) การอัปเดต (updating) หรือการลบ (deleting) เรคคอร์ด เป็นต้นครับ/ค่ะ

ทั้งสองระดับนี้สืบทอดมาจาก EventEmitter ของ Node.js ซึ่งรองรับการใช้งานอินเทอร์เฟซมาตรฐานอย่าง .on() .off() และ .emit() ครับ/ค่ะ นอกจากนี้ NocoBase ยังได้ขยายการรองรับ emitAsync เพื่อใช้ในการทริกเกอร์เหตุการณ์แบบอะซิงโครนัส (asynchronously) และรอให้ Listener ทั้งหมดทำงานจนเสร็จสมบูรณ์อีกด้วยครับ/ค่ะ

#ตำแหน่งที่ควรลงทะเบียน Event Listener

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

import { Plugin } from '@nocobase/server';

export default class PluginHelloServer extends Plugin {
  async beforeLoad() {

    // ดักฟังเหตุการณ์ของแอปพลิเคชัน
    this.app.on('afterStart', () => {
      app.logger.info('NocoBase ได้เริ่มต้นทำงานแล้ว');
    });

    // ดักฟังเหตุการณ์ของฐานข้อมูล
    this.db.on('afterCreate', (model) => {
      if (model.collectionName === 'posts') {
        app.logger.info(`โพสต์ใหม่: ${model.get('title')}`);
      }
    });
  }
}

#การดักฟังเหตุการณ์ระดับแอปพลิเคชัน app.on()

เหตุการณ์ระดับแอปพลิเคชันใช้สำหรับดักจับการเปลี่ยนแปลงวงจรชีวิตของแอปพลิเคชัน NocoBase และปลั๊กอินครับ/ค่ะ เหมาะสำหรับการทำตรรกะการเริ่มต้น (initialization logic) การลงทะเบียนทรัพยากร (resource registration) หรือการตรวจสอบการพึ่งพาของปลั๊กอิน (plugin dependency detection) เป็นต้น

#ประเภทเหตุการณ์ที่พบบ่อย

ชื่อเหตุการณ์ช่วงเวลาที่ทริกเกอร์การใช้งานทั่วไป
beforeLoad / afterLoadก่อน / หลังการโหลดแอปพลิเคชันลงทะเบียนทรัพยากร, กำหนดค่าเริ่มต้น
beforeStart / afterStartก่อน / หลังการเริ่มต้นบริการเริ่มต้นงาน, พิมพ์บันทึกการเริ่มต้น
beforeInstall / afterInstallก่อน / หลังการติดตั้งแอปพลิเคชันกำหนดค่าข้อมูลเริ่มต้น, นำเข้าเทมเพลต
beforeStop / afterStopก่อน / หลังการหยุดบริการล้างทรัพยากร, บันทึกสถานะ
beforeDestroy / afterDestroyก่อน / หลังการทำลายแอปพลิเคชันลบแคช, ตัดการเชื่อมต่อ
beforeLoadPlugin / afterLoadPluginก่อน / หลังการโหลดปลั๊กอินแก้ไขการตั้งค่าปลั๊กอินหรือขยายฟังก์ชันการทำงาน
beforeEnablePlugin / afterEnablePluginก่อน / หลังการเปิดใช้งานปลั๊กอินตรวจสอบการพึ่งพา, กำหนดค่าตรรกะปลั๊กอินเริ่มต้น
beforeDisablePlugin / afterDisablePluginก่อน / หลังการปิดใช้งานปลั๊กอินล้างทรัพยากรปลั๊กอิน
afterUpgradeหลังจากอัปเกรดแอปพลิเคชันเสร็จสมบูรณ์ดำเนินการย้ายข้อมูลหรือแก้ไขความเข้ากันได้

ตัวอย่าง: การดักฟังเหตุการณ์การเริ่มต้นแอปพลิเคชัน

app.on('afterStart', async () => {
  app.logger.info('🚀 บริการ NocoBase ได้เริ่มต้นทำงานแล้ว!');
});

ตัวอย่าง: การดักฟังเหตุการณ์การโหลดปลั๊กอิน

app.on('afterLoadPlugin', ({ plugin }) => {
  app.logger.info(`ปลั๊กอิน ${plugin.name} ได้ถูกโหลดแล้ว`);
});

#การดักฟังเหตุการณ์ระดับฐานข้อมูล db.on()

เหตุการณ์ระดับฐานข้อมูลสามารถดักจับการเปลี่ยนแปลงข้อมูลต่าง ๆ ในระดับโมเดลได้ครับ/ค่ะ เหมาะสำหรับการทำ Audit (ตรวจสอบ), การซิงโครไนซ์ (synchronization), การเติมข้อมูลอัตโนมัติ (auto-filling) และการดำเนินการอื่น ๆ

#ประเภทเหตุการณ์ที่พบบ่อย

ชื่อเหตุการณ์ช่วงเวลาที่ทริกเกอร์
beforeSync / afterSyncก่อน / หลังการซิงโครไนซ์โครงสร้างฐานข้อมูล
beforeValidate / afterValidateก่อน / หลังการตรวจสอบความถูกต้องของข้อมูล
beforeCreate / afterCreateก่อน / หลังการสร้างเรคคอร์ด
beforeUpdate / afterUpdateก่อน / หลังการอัปเดตเรคคอร์ด
beforeSave / afterSaveก่อน / หลังการบันทึก (รวมถึงการสร้างและการอัปเดต)
beforeDestroy / afterDestroyก่อน / หลังการลบเรคคอร์ด
afterCreateWithAssociations / afterUpdateWithAssociations / afterSaveWithAssociationsหลังจากดำเนินการที่รวมข้อมูลความสัมพันธ์
beforeDefineCollection / afterDefineCollectionก่อน / หลังการกำหนดคอลเลกชัน
beforeRemoveCollection / afterRemoveCollectionก่อน / หลังการลบคอลเลกชัน

ตัวอย่าง: การดักฟังเหตุการณ์หลังจากสร้างข้อมูล

db.on('afterCreate', async (model, options) => {
  db.logger.info('ข้อมูลได้ถูกสร้างแล้ว!');
});

ตัวอย่าง: การดักฟังเหตุการณ์ก่อนอัปเดตข้อมูล

db.on('beforeUpdate', async (model, options) => {
  db.logger.info('ข้อมูลกำลังจะถูกอัปเดต!');
});